1065 lines
36 KiB
C++
1065 lines
36 KiB
C++
// *****************************************************************************
|
|
// *****************************************************************************
|
|
// Copyright 2012 - 2015, Cadence Design Systems
|
|
//
|
|
// This file is part of the Cadence LEF/DEF Open Source
|
|
// Distribution, Product Version 5.8.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
// implied. See the License for the specific language governing
|
|
// permissions and limitations under the License.
|
|
//
|
|
// For updates, support, or to become part of the LEF/DEF Community,
|
|
// check www.openeda.org for details.
|
|
//
|
|
// $Author: dell $
|
|
// $Revision: #1 $
|
|
// $Date: 2017/06/06 $
|
|
// $State: $
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
|
|
#ifndef lefiLayer_h
|
|
#define lefiLayer_h
|
|
|
|
#include <stdio.h>
|
|
#include "lefiKRDefs.hpp"
|
|
#include "lefiMisc.hpp"
|
|
|
|
BEGIN_LEFDEF_PARSER_NAMESPACE
|
|
|
|
typedef enum lefiAntennaEnum {
|
|
lefiAntennaAR,
|
|
lefiAntennaDAR,
|
|
lefiAntennaCAR,
|
|
lefiAntennaCDAR,
|
|
lefiAntennaAF,
|
|
lefiAntennaSAR,
|
|
lefiAntennaDSAR,
|
|
lefiAntennaCSAR,
|
|
lefiAntennaCDSAR,
|
|
lefiAntennaSAF,
|
|
lefiAntennaO,
|
|
lefiAntennaADR
|
|
} lefiAntennaEnum;
|
|
|
|
class lefiAntennaPWL {
|
|
public:
|
|
lefiAntennaPWL();
|
|
~lefiAntennaPWL();
|
|
|
|
static lefiAntennaPWL* create();
|
|
void Init();
|
|
void clear();
|
|
void Destroy();
|
|
|
|
void addAntennaPWL(double d, double r);
|
|
|
|
int numPWL() const;
|
|
double PWLdiffusion(int index);
|
|
double PWLratio(int index);
|
|
|
|
protected:
|
|
int numAlloc_;
|
|
int numPWL_;
|
|
double* d_;
|
|
double* r_;
|
|
};
|
|
|
|
class lefiLayerDensity {
|
|
public:
|
|
lefiLayerDensity();
|
|
~lefiLayerDensity();
|
|
|
|
void Init(const char* type);
|
|
void Destroy();
|
|
void clear();
|
|
|
|
void setOneEntry(double entry);
|
|
void addFrequency(int num, double* frequency);
|
|
void addWidth(int num, double* width);
|
|
void addTableEntry(int num, double* entry);
|
|
void addCutarea(int num, double* cutarea);
|
|
|
|
char* type() const;
|
|
int hasOneEntry() const;
|
|
double oneEntry() const;
|
|
int numFrequency() const;
|
|
double frequency(int index) const;
|
|
int numWidths() const;
|
|
double width(int index) const;
|
|
int numTableEntries() const;
|
|
double tableEntry(int index) const;
|
|
int numCutareas() const;
|
|
double cutArea(int index) const;
|
|
|
|
protected:
|
|
char* type_;
|
|
double oneEntry_;
|
|
int numFrequency_;
|
|
double* frequency_;
|
|
int numWidths_;
|
|
double* widths_;
|
|
int numTableEntries_;
|
|
double* tableEntries_;
|
|
int numCutareas_;
|
|
double* cutareas_;
|
|
};
|
|
|
|
// 5.5
|
|
class lefiParallel {
|
|
public:
|
|
lefiParallel();
|
|
~lefiParallel();
|
|
|
|
void Init();
|
|
void clear();
|
|
void Destroy();
|
|
|
|
void addParallelLength(int numLength, double* lengths);
|
|
void addParallelWidth(double width);
|
|
void addParallelWidthSpacing(int numSpacing, double* spacings);
|
|
|
|
int numLength() const;
|
|
int numWidth() const;
|
|
double length(int iLength) const;
|
|
double width(int iWidth) const;
|
|
double widthSpacing(int iWidth, int iWidthSpacing) const;
|
|
|
|
protected:
|
|
int numLength_;
|
|
int numWidth_;
|
|
int numWidthAllocated_;
|
|
double* length_;
|
|
double* width_;
|
|
double* widthSpacing_;
|
|
};
|
|
|
|
// 5.5
|
|
class lefiInfluence {
|
|
public:
|
|
lefiInfluence();
|
|
~lefiInfluence();
|
|
|
|
void Init();
|
|
void clear();
|
|
void Destroy();
|
|
|
|
void addInfluence(double width, double distance, double spacing);
|
|
|
|
int numInfluenceEntry() const;
|
|
double width(int index) const;
|
|
double distance(int index) const;
|
|
double spacing(int index) const;
|
|
|
|
protected:
|
|
int numAllocated_;
|
|
int numWidth_;
|
|
int numDistance_;
|
|
int numSpacing_;
|
|
double* width_;
|
|
double* distance_;
|
|
double* spacing_;
|
|
};
|
|
|
|
// 5.7
|
|
class lefiTwoWidths {
|
|
public:
|
|
lefiTwoWidths();
|
|
~lefiTwoWidths();
|
|
|
|
void Init();
|
|
void clear();
|
|
void Destroy();
|
|
|
|
void addTwoWidths(double width, double runLength, int numSpacing,
|
|
double* spacings, int hasPRL = 0);
|
|
|
|
int numWidth() const;
|
|
double width(int iWidth) const;
|
|
int hasWidthPRL(int iWidth) const;
|
|
double widthPRL(int iWidth) const;
|
|
int numWidthSpacing(int iWidth) const;
|
|
double widthSpacing(int iWidth, int iWidthSpacing) const;
|
|
|
|
protected:
|
|
int numWidth_;
|
|
int numWidthAllocated_;
|
|
double* width_;
|
|
double* prl_;
|
|
int* hasPRL_;
|
|
int* numWidthSpacing_; // each slot contains number of spacing of slot
|
|
double* widthSpacing_;
|
|
int* atNsp_; // accumulate total number of spacing
|
|
};
|
|
|
|
// 5.5
|
|
class lefiSpacingTable {
|
|
public:
|
|
lefiSpacingTable();
|
|
~lefiSpacingTable();
|
|
|
|
void Init();
|
|
void clear();
|
|
void Destroy();
|
|
|
|
void addParallelLength(int numLength, double* lengths);
|
|
void addParallelWidth(double width);
|
|
void addParallelWidthSpacing(int numSpacing, double* spacing);
|
|
void setInfluence();
|
|
void addInfluence(double width, double distance, double spacing);
|
|
void addTwoWidths(double width, double runLength, int numSpacing,
|
|
double* spacing, int hasPRL = 0); // 5.7
|
|
|
|
int isInfluence() const;
|
|
lefiInfluence* influence() const;
|
|
int isParallel() const;
|
|
lefiParallel* parallel() const;
|
|
lefiTwoWidths* twoWidths() const; // 5.7
|
|
|
|
protected:
|
|
int hasInfluence_;
|
|
lefiInfluence* influence_;
|
|
lefiParallel* parallel_;
|
|
lefiTwoWidths* twoWidths_; // 5.7
|
|
};
|
|
|
|
// 5.7
|
|
class lefiOrthogonal {
|
|
public:
|
|
lefiOrthogonal();
|
|
~lefiOrthogonal();
|
|
|
|
void Init();
|
|
void Destroy();
|
|
|
|
void addOrthogonal(double cutWithin, double ortho);
|
|
|
|
int numOrthogonal() const;
|
|
double cutWithin(int index) const;
|
|
double orthoSpacing(int index) const;
|
|
|
|
protected:
|
|
int numAllocated_;
|
|
int numCutOrtho_;
|
|
double* cutWithin_;
|
|
double* ortho_;
|
|
};
|
|
|
|
// 5.5
|
|
class lefiAntennaModel {
|
|
public:
|
|
lefiAntennaModel();
|
|
~lefiAntennaModel();
|
|
|
|
void Init();
|
|
void Destroy();
|
|
|
|
void setAntennaModel(int oxide);
|
|
void setAntennaAreaRatio(double value);
|
|
void setAntennaCumAreaRatio(double value);
|
|
void setAntennaAreaFactor(double value);
|
|
void setAntennaSideAreaRatio(double value);
|
|
void setAntennaCumSideAreaRatio(double value);
|
|
void setAntennaSideAreaFactor(double value);
|
|
void setAntennaValue(lefiAntennaEnum antennaType, double value);
|
|
void setAntennaDUO(lefiAntennaEnum antennaType);
|
|
void setAntennaPWL(lefiAntennaEnum antennaType, lefiAntennaPWL* pwl);
|
|
void setAntennaCumRoutingPlusCut(); // 5.7
|
|
void setAntennaGatePlusDiff(double value); // 5.7
|
|
void setAntennaAreaMinusDiff(double value); // 5.7
|
|
|
|
int hasAntennaAreaRatio() const;
|
|
int hasAntennaDiffAreaRatio() const;
|
|
int hasAntennaDiffAreaRatioPWL() const;
|
|
int hasAntennaCumAreaRatio() const;
|
|
int hasAntennaCumDiffAreaRatio() const;
|
|
int hasAntennaCumDiffAreaRatioPWL() const;
|
|
int hasAntennaAreaFactor() const;
|
|
int hasAntennaAreaFactorDUO() const;
|
|
int hasAntennaSideAreaRatio() const;
|
|
int hasAntennaDiffSideAreaRatio() const;
|
|
int hasAntennaDiffSideAreaRatioPWL() const;
|
|
int hasAntennaCumSideAreaRatio() const;
|
|
int hasAntennaCumDiffSideAreaRatio() const;
|
|
int hasAntennaCumDiffSideAreaRatioPWL() const;
|
|
int hasAntennaSideAreaFactor() const;
|
|
int hasAntennaSideAreaFactorDUO() const;
|
|
int hasAntennaCumRoutingPlusCut() const; // 5.7
|
|
int hasAntennaGatePlusDiff() const; // 5.7
|
|
int hasAntennaAreaMinusDiff() const; // 5.7
|
|
int hasAntennaAreaDiffReducePWL() const; // 5.7
|
|
|
|
char* antennaOxide() const;
|
|
double antennaAreaRatio() const;
|
|
double antennaDiffAreaRatio() const;
|
|
lefiAntennaPWL* antennaDiffAreaRatioPWL() const;
|
|
double antennaCumAreaRatio() const;
|
|
double antennaCumDiffAreaRatio() const;
|
|
lefiAntennaPWL* antennaCumDiffAreaRatioPWL() const;
|
|
double antennaAreaFactor() const;
|
|
double antennaSideAreaRatio() const;
|
|
double antennaDiffSideAreaRatio() const;
|
|
lefiAntennaPWL* antennaDiffSideAreaRatioPWL() const;
|
|
double antennaCumSideAreaRatio() const;
|
|
double antennaCumDiffSideAreaRatio() const;
|
|
lefiAntennaPWL* antennaCumDiffSideAreaRatioPWL() const;
|
|
double antennaSideAreaFactor() const;
|
|
double antennaGatePlusDiff() const; // 5.7
|
|
double antennaAreaMinusDiff() const; // 5.7
|
|
lefiAntennaPWL* antennaAreaDiffReducePWL() const; // 5.7
|
|
|
|
protected:
|
|
int hasAntennaAreaRatio_;
|
|
int hasAntennaDiffAreaRatio_;
|
|
int hasAntennaDiffAreaRatioPWL_;
|
|
int hasAntennaCumAreaRatio_;
|
|
int hasAntennaCumDiffAreaRatio_;
|
|
int hasAntennaCumDiffAreaRatioPWL_;
|
|
int hasAntennaAreaFactor_;
|
|
int hasAntennaAreaFactorDUO_;
|
|
int hasAntennaSideAreaRatio_;
|
|
int hasAntennaDiffSideAreaRatio_;
|
|
int hasAntennaDiffSideAreaRatioPWL_;
|
|
int hasAntennaCumSideAreaRatio_;
|
|
int hasAntennaCumDiffSideAreaRatio_;
|
|
int hasAntennaCumDiffSideAreaRatioPWL_;
|
|
int hasAntennaSideAreaFactor_;
|
|
int hasAntennaSideAreaFactorDUO_;
|
|
int hasAntennaCumRoutingPlusCut_; // 5.7
|
|
int hasAntennaGatePlusDiff_; // 5.7
|
|
int hasAntennaAreaMinusDiff_; // 5.7
|
|
|
|
char* oxide_;
|
|
double antennaAreaRatio_;
|
|
double antennaDiffAreaRatio_;
|
|
lefiAntennaPWL* antennaDiffAreaRatioPWL_;
|
|
double antennaCumAreaRatio_;
|
|
double antennaCumDiffAreaRatio_;
|
|
lefiAntennaPWL* antennaCumDiffAreaRatioPWL_;
|
|
double antennaAreaFactor_;
|
|
double antennaSideAreaRatio_;
|
|
double antennaDiffSideAreaRatio_;
|
|
lefiAntennaPWL* antennaDiffSideAreaRatioPWL_;
|
|
double antennaCumSideAreaRatio_;
|
|
double antennaCumDiffSideAreaRatio_;
|
|
lefiAntennaPWL* antennaCumDiffSideAreaRatioPWL_;
|
|
double antennaSideAreaFactor_;
|
|
double antennaGatePlusDiff_; // 5.7
|
|
double antennaAreaMinusDiff_; // 5.7
|
|
lefiAntennaPWL* antennaAreaDiffReducePWL_; // 5.7
|
|
};
|
|
|
|
class lefiLayer {
|
|
public:
|
|
lefiLayer();
|
|
void Init();
|
|
|
|
void Destroy();
|
|
~lefiLayer();
|
|
|
|
void clear();
|
|
void setName(const char* name); // calls clear to init
|
|
void setType(const char* typ);
|
|
void setPitch(double num);
|
|
void setMask(int num); // 5.8
|
|
void setPitchXY(double xdist, double ydist); // 5.6
|
|
void setOffset(double num);
|
|
void setOffsetXY(double xdist, double ydist); // 5.6
|
|
void setWidth(double num);
|
|
void setArea(double num);
|
|
void setDiagPitch(double dist); // 5.6
|
|
void setDiagPitchXY(double xdist, double ydist); // 5.6
|
|
void setDiagWidth(double width); // 5.6
|
|
void setDiagSpacing(double spacing); // 5.6
|
|
void setSpacingMin(double dist);
|
|
void setSpacingName(const char* spacingName); // for CUT layer
|
|
void setSpacingLayerStack(); // 5.7 for CUT layer
|
|
void setSpacingAdjacent(int numCuts, double distance); // 5.5for CUT layer
|
|
void setSpacingRange(double left, double right);
|
|
void setSpacingRangeUseLength();
|
|
void setSpacingRangeInfluence(double infLength);
|
|
void setSpacingRangeInfluenceRange(double min, double max);
|
|
void setSpacingRangeRange(double min, double max);
|
|
void setSpacingLength(double num);
|
|
void setSpacingLengthRange(double min, double max);
|
|
void setSpacingCenterToCenter();
|
|
void setSpacingParallelOverlap(); // 5.7
|
|
void setSpacingArea(double cutArea); // 5.7
|
|
void setSpacingEol(double width, double within); // 5.7
|
|
void setSpacingParSW(double space, double within); // 5.7
|
|
void setSpacingParTwoEdges(); // 5.7
|
|
void setSpacingAdjacentExcept(); // 5.7
|
|
void setSpacingSamenet(); // 5.7
|
|
void setSpacingSamenetPGonly(); // 5.7
|
|
void setSpacingTableOrtho(); // 5.7
|
|
void addSpacingTableOrthoWithin(double cutWithin, double ortho); // 5.7
|
|
void setMaxFloatingArea(double num); // 5.7
|
|
void setArraySpacingLongArray(); // 5.7
|
|
void setArraySpacingWidth(double viaWidth); // 5.7
|
|
void setArraySpacingCut(double cutSpacing); // 5.7
|
|
void addArraySpacingArray(int aCuts, double aSpacing); // 5.7
|
|
void setSpacingNotchLength(double minNotchLength); // 5.7
|
|
void setSpacingEndOfNotchWidth (double endOfNotchWidth,
|
|
double minNotchSpacing, double minNotchLength); // 5.7
|
|
void setDirection(const char* dir);
|
|
void setResistance(double num);
|
|
void setCapacitance(double num);
|
|
void setHeight(double num);
|
|
void setWireExtension(double num);
|
|
void setThickness(double num);
|
|
void setShrinkage(double num);
|
|
void setCapMultiplier(double num);
|
|
void setEdgeCap(double num);
|
|
void setAntennaArea(double num);
|
|
void setAntennaLength(double num);
|
|
void setCurrentDensity(double num);
|
|
void setCurrentPoint(double width, double current);
|
|
void setResistancePoint(double width, double res);
|
|
void setCapacitancePoint(double width, double cap);
|
|
void addProp(const char* name, const char* value, const char type);
|
|
void addNumProp(const char* name, const double d,
|
|
const char* value, const char type);
|
|
void addAccurrentDensity(const char* type);
|
|
void setAcOneEntry(double num);
|
|
void addAcFrequency();
|
|
void addAcCutarea();
|
|
void addAcTableEntry();
|
|
void addAcWidth();
|
|
void addDccurrentDensity(const char* type);
|
|
void setDcOneEntry(double num);
|
|
void addDcTableEntry();
|
|
void addDcWidth();
|
|
void addDcCutarea();
|
|
void addNumber(double num);
|
|
void setMaxwidth(double width); // 5.5
|
|
void setMinwidth(double width); // 5.5
|
|
void addMinenclosedarea(double area); // 5.5
|
|
void addMinenclosedareaWidth(double width); // 5.5
|
|
void addMinimumcut(int cuts, double width); // 5.5
|
|
void addMinimumcutWithin(double cutDistance); // 5.7
|
|
void addMinimumcutConnect(const char* direction); // 5.5
|
|
void addMinimumcutLengDis(double length, double distance); // 5.5
|
|
void addParellelLength(double length); // 5.5
|
|
void addParellelSpacing(double width, double spacing); // 5.5
|
|
void addParellelWidth(double width); // 5.5
|
|
void setProtrusion(double width, double length, double width2); // 5.5
|
|
|
|
// 5.6 - minstep switch to multiple and added more options
|
|
void addMinstep(double distance); // 5.5
|
|
void addMinstepType(char* type); // 5.6
|
|
void addMinstepLengthsum(double maxLength); // 5.6
|
|
void addMinstepMaxedges(int maxEdges); // 5.7
|
|
void addMinstepMinAdjLength(double minAdjLength); // 5.7
|
|
void addMinstepMinBetLength(double minBetLength); // 5.7
|
|
void addMinstepXSameCorners(); // 5.7
|
|
|
|
int getNumber(); // this is for the parser internal use only
|
|
|
|
// 5.5 SPACINGTABLE
|
|
void addSpacingTable();
|
|
void addSpParallelLength();
|
|
void addSpParallelWidth(double width);
|
|
void addSpParallelWidthSpacing();
|
|
void setInfluence();
|
|
void setSpTwoWidthsHasPRL(int hasPRL);
|
|
void addSpInfluence(double width, double distance, double spacing);
|
|
void addSpTwoWidths(double width, double runLength); // 5.7
|
|
|
|
|
|
// 5.6
|
|
void addEnclosure(char* enclRule, double overhang1, double overhang2);
|
|
void addEnclosureWidth(double minWidth);
|
|
void addEnclosureExceptEC(double cutWithin); // 5.7
|
|
void addEnclosureLength(double minLength); // 5.7
|
|
void addEnclosureExtraCut(); // 5.7+
|
|
void addPreferEnclosure(char* enclRule, double overhang1, double overhang2);
|
|
void addPreferEnclosureWidth(double minWidth);
|
|
void setResPerCut(double value);
|
|
void setDiagMinEdgeLength(double value);
|
|
void setMinSize(lefiGeometries* geom);
|
|
|
|
// 5.8
|
|
// POLYROUTING, MIMCAP, TSV, PASSIVATION, NWELL
|
|
void setLayerType(const char* lType) ;
|
|
|
|
int hasType() const ;
|
|
int hasLayerType() const ; // 5.8 - Some layers can be another types
|
|
// ROUTING can be POLYROUTING or MIMCAP
|
|
// CUT can be TSV or PASSIVATION
|
|
// MASTERSLICE can be NWELL
|
|
int hasMask() const ; // 5.8
|
|
int hasPitch() const ;
|
|
int hasXYPitch() const ; // 5.6
|
|
int hasOffset() const ;
|
|
int hasXYOffset() const ; // 5.6
|
|
int hasWidth() const ;
|
|
int hasArea() const ;
|
|
int hasDiagPitch() const; // 5.6
|
|
int hasXYDiagPitch() const; // 5.6
|
|
int hasDiagWidth() const; // 5.6
|
|
int hasDiagSpacing() const; // 5.6
|
|
int hasSpacingNumber() const ;
|
|
int hasSpacingName(int index) const ;
|
|
int hasSpacingLayerStack(int index) const ; // 5.7
|
|
int hasSpacingAdjacent(int index) const ;
|
|
int hasSpacingCenterToCenter(int index) const ;
|
|
int hasSpacingRange(int index) const ;
|
|
int hasSpacingRangeUseLengthThreshold(int index) const;
|
|
int hasSpacingRangeInfluence(int index) const;
|
|
int hasSpacingRangeInfluenceRange(int index) const;
|
|
int hasSpacingRangeRange(int index) const;
|
|
int hasSpacingLengthThreshold(int index) const;
|
|
int hasSpacingLengthThresholdRange(int index) const;
|
|
int hasSpacingParallelOverlap(int index) const; // 5.7
|
|
int hasSpacingArea(int index) const; // 5.7
|
|
int hasSpacingEndOfLine(int index) const; // 5.7
|
|
int hasSpacingParellelEdge(int index) const; // 5.7
|
|
int hasSpacingTwoEdges(int index) const; // 5.7
|
|
int hasSpacingAdjacentExcept(int index) const; // 5.7
|
|
int hasSpacingSamenet(int index) const; // 5.7
|
|
int hasSpacingSamenetPGonly(int index) const; // 5.7
|
|
int hasSpacingNotchLength(int index) const; // 5.7
|
|
int hasSpacingEndOfNotchWidth(int index) const; // 5.7
|
|
int hasDirection() const ;
|
|
int hasResistance() const ;
|
|
int hasResistanceArray() const ;
|
|
int hasCapacitance() const ;
|
|
int hasCapacitanceArray() const ;
|
|
int hasHeight() const ;
|
|
int hasThickness() const ;
|
|
int hasWireExtension() const ;
|
|
int hasShrinkage() const ;
|
|
int hasCapMultiplier() const ;
|
|
int hasEdgeCap() const ;
|
|
int hasAntennaLength() const ;
|
|
int hasAntennaArea() const ;
|
|
int hasCurrentDensityPoint() const ;
|
|
int hasCurrentDensityArray() const ;
|
|
int hasAccurrentDensity() const;
|
|
int hasDccurrentDensity() const;
|
|
|
|
int numProps() const;
|
|
const char* propName(int index) const;
|
|
const char* propValue(int index) const;
|
|
double propNumber(int index) const;
|
|
const char propType(int index) const;
|
|
int propIsNumber(int index) const;
|
|
int propIsString(int index) const;
|
|
|
|
int numSpacing() const;
|
|
|
|
char* name() const ;
|
|
const char* type() const ;
|
|
const char* layerType() const ; // 5.8
|
|
double pitch() const ;
|
|
int mask() const; // 5.8
|
|
double pitchX() const ; // 5.6
|
|
double pitchY() const ; // 5.6
|
|
double offset() const ;
|
|
double offsetX() const ; // 5.6
|
|
double offsetY() const ; // 5.6
|
|
double width() const ;
|
|
double area() const ;
|
|
double diagPitch() const ; // 5.6
|
|
double diagPitchX() const ; // 5.6
|
|
double diagPitchY() const ; // 5.6
|
|
double diagWidth() const ; // 5.6
|
|
double diagSpacing() const ; // 5.6
|
|
double spacing(int index) const ;
|
|
char* spacingName(int index) const ; // for CUT layer
|
|
int spacingAdjacentCuts(int index) const ; // 5.5 - for CUT layer
|
|
double spacingAdjacentWithin(int index) const ; // 5.5 - for CUT layer
|
|
double spacingArea(int index) const; // 5.7 - for CUT layer
|
|
double spacingRangeMin(int index) const ;
|
|
double spacingRangeMax(int index) const ;
|
|
double spacingRangeInfluence(int index) const ;
|
|
double spacingRangeInfluenceMin(int index) const ;
|
|
double spacingRangeInfluenceMax(int index) const ;
|
|
double spacingRangeRangeMin(int index) const ;
|
|
double spacingRangeRangeMax(int index) const ;
|
|
double spacingLengthThreshold(int index) const;
|
|
double spacingLengthThresholdRangeMin(int index) const;
|
|
double spacingLengthThresholdRangeMax(int index) const;
|
|
|
|
// 5.7 Spacing endofline
|
|
double spacingEolWidth(int index) const;
|
|
double spacingEolWithin(int index) const;
|
|
double spacingParSpace(int index) const;
|
|
double spacingParWithin(int index) const;
|
|
|
|
// 5.7 Spacing Notch
|
|
double spacingNotchLength(int index) const;
|
|
double spacingEndOfNotchWidth(int index) const;
|
|
double spacingEndOfNotchSpacing(int index) const;
|
|
double spacingEndOfNotchLength(int index) const;
|
|
|
|
// 5.5 Minimum cut rules
|
|
int numMinimumcut() const;
|
|
int minimumcut(int index) const;
|
|
double minimumcutWidth(int index) const;
|
|
int hasMinimumcutWithin(int index) const; // 5.7
|
|
double minimumcutWithin(int index) const; // 5.7
|
|
int hasMinimumcutConnection(int index) const; // FROMABOVE|FROMBELOW
|
|
const char* minimumcutConnection(int index) const; // FROMABOVE|FROMBELOW
|
|
int hasMinimumcutNumCuts(int index) const;
|
|
double minimumcutLength(int index) const;
|
|
double minimumcutDistance(int index) const;
|
|
|
|
const char* direction() const ;
|
|
double resistance() const ;
|
|
double capacitance() const ;
|
|
double height() const ;
|
|
double wireExtension() const ;
|
|
double thickness() const ;
|
|
double shrinkage() const ;
|
|
double capMultiplier() const ;
|
|
double edgeCap() const ;
|
|
double antennaLength() const ;
|
|
double antennaArea() const ;
|
|
double currentDensityPoint() const ;
|
|
void currentDensityArray(int* numPoints,
|
|
double** widths, double** current) const ;
|
|
void capacitanceArray(int* numPoints,
|
|
double** widths, double** resValues) const ;
|
|
void resistanceArray(int* numPoints,
|
|
double** widths, double** capValues) const ;
|
|
|
|
int numAccurrentDensity() const;
|
|
lefiLayerDensity* accurrent(int index) const;
|
|
int numDccurrentDensity() const;
|
|
lefiLayerDensity* dccurrent(int index) const;
|
|
|
|
// 3/23/2000 - Wanda da Rosa. The following are for 5.4 Antenna.
|
|
// Only 5.4 or 5.3 are allowed in a lef file, but not both
|
|
void setAntennaAreaRatio(double value);
|
|
void setAntennaCumAreaRatio(double value);
|
|
void setAntennaAreaFactor(double value);
|
|
void setAntennaSideAreaRatio(double value);
|
|
void setAntennaCumSideAreaRatio(double value);
|
|
void setAntennaSideAreaFactor(double value);
|
|
void setAntennaValue(lefiAntennaEnum antennaType, double value);
|
|
void setAntennaDUO(lefiAntennaEnum antennaType);
|
|
void setAntennaPWL(lefiAntennaEnum antennaType, lefiAntennaPWL* pwl);
|
|
void setAntennaCumRoutingPlusCut(); // 5.7
|
|
void setAntennaGatePlusDiff(double value); // 5.7
|
|
void setAntennaAreaMinusDiff(double value); // 5.7
|
|
void addAntennaModel (int aOxide); // 5.5
|
|
|
|
// 5.5
|
|
int numAntennaModel() const;
|
|
lefiAntennaModel* antennaModel(int index) const;
|
|
|
|
// The following is 8/21/01 5.4 enhancements
|
|
void setSlotWireWidth(double num);
|
|
void setSlotWireLength(double num);
|
|
void setSlotWidth(double num);
|
|
void setSlotLength(double num);
|
|
void setMaxAdjacentSlotSpacing(double num);
|
|
void setMaxCoaxialSlotSpacing(double num);
|
|
void setMaxEdgeSlotSpacing(double num);
|
|
void setSplitWireWidth(double num);
|
|
void setMinimumDensity(double num);
|
|
void setMaximumDensity(double num);
|
|
void setDensityCheckWindow(double length, double width);
|
|
void setDensityCheckStep(double num);
|
|
void setFillActiveSpacing(double num);
|
|
|
|
int hasSlotWireWidth() const;
|
|
int hasSlotWireLength() const;
|
|
int hasSlotWidth() const;
|
|
int hasSlotLength() const;
|
|
int hasMaxAdjacentSlotSpacing() const;
|
|
int hasMaxCoaxialSlotSpacing() const;
|
|
int hasMaxEdgeSlotSpacing() const;
|
|
int hasSplitWireWidth() const;
|
|
int hasMinimumDensity() const;
|
|
int hasMaximumDensity() const;
|
|
int hasDensityCheckWindow() const;
|
|
int hasDensityCheckStep() const;
|
|
int hasFillActiveSpacing() const;
|
|
int hasMaxwidth() const; // 5.5
|
|
int hasMinwidth() const; // 5.5
|
|
int hasMinstep() const; // 5.5
|
|
int hasProtrusion() const; // 5.5
|
|
|
|
double slotWireWidth() const;
|
|
double slotWireLength() const;
|
|
double slotWidth() const;
|
|
double slotLength() const;
|
|
double maxAdjacentSlotSpacing() const;
|
|
double maxCoaxialSlotSpacing() const;
|
|
double maxEdgeSlotSpacing() const;
|
|
double splitWireWidth() const;
|
|
double minimumDensity() const;
|
|
double maximumDensity() const;
|
|
double densityCheckWindowLength() const;
|
|
double densityCheckWindowWidth() const;
|
|
double densityCheckStep() const;
|
|
double fillActiveSpacing() const;
|
|
double maxwidth() const; // 5.5
|
|
double minwidth() const; // 5.5
|
|
double protrusionWidth1() const; // 5.5
|
|
double protrusionLength() const; // 5.5
|
|
double protrusionWidth2() const; // 5.5
|
|
|
|
int numMinstep() const; // 5.6
|
|
double minstep(int index) const; // 5.5, 5.6 switch to multiple
|
|
int hasMinstepType(int index) const; // 5.6
|
|
char* minstepType(int index) const; // 5.6
|
|
int hasMinstepLengthsum(int index) const; // 5.6
|
|
double minstepLengthsum(int index) const; // 5.6
|
|
int hasMinstepMaxedges(int index) const; // 5.7
|
|
int minstepMaxedges(int index) const; // 5.7
|
|
int hasMinstepMinAdjLength(int index) const; // 5.7
|
|
double minstepMinAdjLength(int index) const; // 5.7
|
|
int hasMinstepMinBetLength(int index) const; // 5.7
|
|
double minstepMinBetLength(int index) const; // 5.7
|
|
int hasMinstepXSameCorners(int index) const; // 5.7
|
|
|
|
// 5.5 MINENCLOSEDAREA
|
|
int numMinenclosedarea() const;
|
|
double minenclosedarea(int index) const;
|
|
int hasMinenclosedareaWidth(int index) const;
|
|
double minenclosedareaWidth(int index) const;
|
|
|
|
// 5.5 SPACINGTABLE FOR LAYER ROUTING
|
|
int numSpacingTable();
|
|
lefiSpacingTable* spacingTable(int index);
|
|
|
|
// 5.6 ENCLOSURE, PREFERENCLOSURE, RESISTANCEPERCUT & DIAGMINEDGELENGTH
|
|
int numEnclosure() const;
|
|
int hasEnclosureRule(int index) const;
|
|
char* enclosureRule(int index) ;
|
|
double enclosureOverhang1(int index) const;
|
|
double enclosureOverhang2(int index) const;
|
|
int hasEnclosureWidth(int index) const;
|
|
double enclosureMinWidth(int index) const;
|
|
int hasEnclosureExceptExtraCut(int index) const; // 5.7
|
|
double enclosureExceptExtraCut(int index) const; // 5.7
|
|
int hasEnclosureMinLength(int index) const; // 5.7
|
|
double enclosureMinLength(int index) const; // 5.7
|
|
int numPreferEnclosure() const;
|
|
int hasPreferEnclosureRule(int index) const;
|
|
char* preferEnclosureRule(int index) ;
|
|
double preferEnclosureOverhang1(int index) const;
|
|
double preferEnclosureOverhang2(int index) const;
|
|
int hasPreferEnclosureWidth(int index) const;
|
|
double preferEnclosureMinWidth(int index) const;
|
|
int hasResistancePerCut() const;
|
|
double resistancePerCut() const;
|
|
int hasDiagMinEdgeLength() const;
|
|
double diagMinEdgeLength() const;
|
|
int numMinSize() const;
|
|
double minSizeWidth(int index) const;
|
|
double minSizeLength(int index) const;
|
|
|
|
// 5.7
|
|
int hasMaxFloatingArea() const;
|
|
double maxFloatingArea() const;
|
|
int hasArraySpacing() const;
|
|
int hasLongArray() const;
|
|
int hasViaWidth() const;
|
|
double viaWidth() const;
|
|
double cutSpacing() const;
|
|
int numArrayCuts() const;
|
|
int arrayCuts(int index) const;
|
|
double arraySpacing(int index) const;
|
|
int hasSpacingTableOrtho() const; // SPACINGTABLE ORTHOGONAL FOR LAYER CUT
|
|
lefiOrthogonal *orthogonal() const;
|
|
|
|
void parse65nmRules(); // 5.7
|
|
void parseLEF58Layer(); // 5.8
|
|
int need58PropsProcessing() const; // 5.8
|
|
|
|
// Debug print
|
|
void print(FILE* f) const;
|
|
|
|
private:
|
|
void parseSpacing(int index);
|
|
void parseMaxFloating(int index);
|
|
void parseArraySpacing(int index);
|
|
void parseMinstep(int index);
|
|
void parseAntennaCumRouting(int index);
|
|
void parseAntennaGatePlus(int index);
|
|
void parseAntennaAreaMinus(int index);
|
|
void parseAntennaAreaDiff(int index);
|
|
|
|
void parseLayerType(int index); // 5.8
|
|
void parseLayerEnclosure(int index); // 5.8
|
|
void parseLayerWidthTable(int indxe); // 5.8
|
|
|
|
protected:
|
|
char* name_;
|
|
int nameSize_;
|
|
char* type_;
|
|
int typeSize_;
|
|
char* layerType_; // 5.8 - POLYROUTING, MIMCAP, TSV, PASSIVATION, NWELL
|
|
|
|
int hasPitch_;
|
|
int hasMask_; // 5.8 native
|
|
int hasOffset_;
|
|
int hasWidth_;
|
|
int hasArea_;
|
|
int hasSpacing_;
|
|
int hasDiagPitch_; // 5.6
|
|
int hasDiagWidth_; // 5.6
|
|
int hasDiagSpacing_; // 5.6
|
|
int* hasSpacingName_; // 5.5
|
|
int* hasSpacingLayerStack_; // 5.7
|
|
int* hasSpacingAdjacent_; // 5.5
|
|
int* hasSpacingRange_; // pcr 409334
|
|
int* hasSpacingUseLengthThreshold_; // pcr 282799, due to mult. spacing allow
|
|
int* hasSpacingLengthThreshold_; // pcr 409334
|
|
int* hasSpacingCenterToCenter_; // 5.6
|
|
int* hasSpacingParallelOverlap_; // 5.7
|
|
int* hasSpacingCutArea_; // 5.7
|
|
int* hasSpacingEndOfLine_; // 5.7
|
|
int* hasSpacingParellelEdge_; // 5.7
|
|
int* hasSpacingTwoEdges_; // 5.7
|
|
int* hasSpacingAdjacentExcept_; // 5.7
|
|
int* hasSpacingSamenet_; // 5.7
|
|
int* hasSpacingSamenetPGonly_; // 5.7
|
|
int hasArraySpacing_; // 5.7
|
|
int hasDirection_;
|
|
int hasResistance_;
|
|
int hasCapacitance_;
|
|
int hasHeight_;
|
|
int hasWireExtension_;
|
|
int hasThickness_;
|
|
int hasShrinkage_;
|
|
int hasCapMultiplier_;
|
|
int hasEdgeCap_;
|
|
int hasAntennaArea_;
|
|
int hasAntennaLength_;
|
|
int hasCurrentDensityPoint_;
|
|
|
|
double currentDensity_;
|
|
double pitchX_; // 5.6
|
|
double pitchY_; // 5.6
|
|
double offsetX_; // 5.6
|
|
double offsetY_; // 5.6
|
|
double diagPitchX_; // 5.6
|
|
double diagPitchY_; // 5.6
|
|
double diagWidth_; // 5.6
|
|
double diagSpacing_; // 5.6
|
|
double width_;
|
|
double area_;
|
|
double wireExtension_;
|
|
int numSpacings_;
|
|
int spacingsAllocated_;
|
|
int maskNumber_; // 5.8
|
|
double* spacing_; // for Cut & routing Layer, spacing is multiple
|
|
char** spacingName_;
|
|
int* spacingAdjacentCuts_; // 5.5
|
|
double* spacingAdjacentWithin_; // 5.5
|
|
double* spacingCutArea_; // 5.7
|
|
double* rangeMin_; // pcr 282799 & 408930, due to mult spacing allow
|
|
double* rangeMax_; // pcr 282799 & 408930, due to mult spacing allow
|
|
double* rangeInfluence_; // pcr 282799 & 408930, due to mult spacing allow
|
|
double* rangeInfluenceRangeMin_; // pcr 388183 & 408930
|
|
double* rangeInfluenceRangeMax_; // pcr 388183 & 408930
|
|
double* rangeRangeMin_; // pcr 408930
|
|
double* rangeRangeMax_; // pcr 408930
|
|
double* lengthThreshold_; // pcr 408930
|
|
double* lengthThresholdRangeMin_; // pcr 408930
|
|
double* lengthThresholdRangeMax_; // pcr 408930
|
|
|
|
// 5.5
|
|
int numMinimumcut_;
|
|
int minimumcutAllocated_;
|
|
int* minimumcut_; // pcr 409334
|
|
double* minimumcutWidth_; // pcr 409334
|
|
int* hasMinimumcutWithin_; // 5.7
|
|
double* minimumcutWithin_; // 5.7
|
|
int* hasMinimumcutConnection_;
|
|
char** minimumcutConnection_;
|
|
int* hasMinimumcutNumCuts_;
|
|
double* minimumcutLength_;
|
|
double* minimumcutDistance_;
|
|
|
|
double maxwidth_; // 5.5
|
|
double minwidth_; // 5.5
|
|
int numMinenclosedarea_; // 5.5
|
|
int minenclosedareaAllocated_; // 5.5
|
|
double* minenclosedarea_; // 5.5
|
|
double* minenclosedareaWidth_; // 5.5
|
|
double protrusionWidth1_; // 5.5
|
|
double protrusionLength_; // 5.5
|
|
double protrusionWidth2_; // 5.5
|
|
|
|
int numMinstep_; // 5.6
|
|
int numMinstepAlloc_; // 5.6
|
|
double* minstep_; // 5.6, switch to multiple
|
|
char** minstepType_; // INSIDECORNER|OUTSIDECORNER|STEP
|
|
double* minstepLengthsum_;
|
|
int* minstepMaxEdges_; // 5.7
|
|
double* minstepMinAdjLength_; // 5.7
|
|
double* minstepMinBetLength_; // 5.7
|
|
int* minstepXSameCorners_; // 5.7
|
|
|
|
char* direction_;
|
|
double resistance_;
|
|
double capacitance_;
|
|
double height_;
|
|
double thickness_;
|
|
double shrinkage_;
|
|
double capMultiplier_;
|
|
double edgeCap_;
|
|
double antennaArea_;
|
|
double antennaLength_;
|
|
|
|
int numCurrentPoints_;
|
|
int currentPointsAllocated_;
|
|
double* currentWidths_;
|
|
double* current_;
|
|
|
|
int numCapacitancePoints_;
|
|
int capacitancePointsAllocated_;
|
|
double* capacitanceWidths_;
|
|
double* capacitances_;
|
|
|
|
int numResistancePoints_;
|
|
int resistancePointsAllocated_;
|
|
double* resistanceWidths_;
|
|
double* resistances_;
|
|
|
|
int numProps_;
|
|
int propsAllocated_;
|
|
char** names_;
|
|
char** values_;
|
|
double* dvalues_;
|
|
char* types_; // I: integer, R: real, S:string
|
|
// Q: quotedstring
|
|
int numAccurrents_; // number of ACCURRENTDENSITY
|
|
int accurrentAllocated_;
|
|
lefiLayerDensity** accurrents_;
|
|
int numDccurrents_; // number of DCCURRENTDENSITY
|
|
int dccurrentAllocated_;
|
|
lefiLayerDensity** dccurrents_;
|
|
int numNums_;
|
|
int numAllocated_;
|
|
double* nums_;
|
|
|
|
// 3/23/2000 - Wanda da Rosa. The following is for 5.4 ANTENNA.
|
|
// Either 5.4 or 5.3 are allowed, not both
|
|
int hasAntennaAreaRatio_;
|
|
int hasAntennaDiffAreaRatio_;
|
|
int hasAntennaDiffAreaRatioPWL_;
|
|
int hasAntennaCumAreaRatio_;
|
|
int hasAntennaCumDiffAreaRatio_;
|
|
int hasAntennaCumDiffAreaRatioPWL_;
|
|
int hasAntennaAreaFactor_;
|
|
int hasAntennaAreaFactorDUO_;
|
|
int hasAntennaSideAreaRatio_;
|
|
int hasAntennaDiffSideAreaRatio_;
|
|
int hasAntennaDiffSideAreaRatioPWL_;
|
|
int hasAntennaCumSideAreaRatio_;
|
|
int hasAntennaCumDiffSideAreaRatio_;
|
|
int hasAntennaCumDiffSideAreaRatioPWL_;
|
|
int hasAntennaSideAreaFactor_;
|
|
int hasAntennaSideAreaFactorDUO_;
|
|
|
|
// 5.5 AntennaModel
|
|
lefiAntennaModel* currentAntennaModel_;
|
|
int numAntennaModel_;
|
|
int antennaModelAllocated_;
|
|
lefiAntennaModel** antennaModel_;
|
|
|
|
// 8/29/2001 - Wanda da Rosa. The following is for 5.4 enhancements.
|
|
int hasSlotWireWidth_;
|
|
int hasSlotWireLength_;
|
|
int hasSlotWidth_;
|
|
int hasSlotLength_;
|
|
int hasMaxAdjacentSlotSpacing_;
|
|
int hasMaxCoaxialSlotSpacing_;
|
|
int hasMaxEdgeSlotSpacing_;
|
|
int hasSplitWireWidth_;
|
|
int hasMinimumDensity_;
|
|
int hasMaximumDensity_;
|
|
int hasDensityCheckWindow_;
|
|
int hasDensityCheckStep_;
|
|
int hasFillActiveSpacing_;
|
|
int hasTwoWidthPRL_;
|
|
|
|
double slotWireWidth_;
|
|
double slotWireLength_;
|
|
double slotWidth_;
|
|
double slotLength_;
|
|
double maxAdjacentSlotSpacing_;
|
|
double maxCoaxialSlotSpacing_;
|
|
double maxEdgeSlotSpacing_;
|
|
double splitWireWidth_;
|
|
double minimumDensity_;
|
|
double maximumDensity_;
|
|
double densityCheckWindowLength_;
|
|
double densityCheckWindowWidth_;
|
|
double densityCheckStep_;
|
|
double fillActiveSpacing_;
|
|
|
|
// 5.5 SPACINGTABLE
|
|
int numSpacingTable_;
|
|
int spacingTableAllocated_;
|
|
lefiSpacingTable** spacingTable_;
|
|
|
|
// 5.6
|
|
int numEnclosure_;
|
|
int enclosureAllocated_;
|
|
char** enclosureRules_;
|
|
double* overhang1_;
|
|
double* overhang2_;
|
|
double* encminWidth_;
|
|
double* cutWithin_;
|
|
double* minLength_;
|
|
int numPreferEnclosure_;
|
|
int preferEnclosureAllocated_;
|
|
char** preferEnclosureRules_;
|
|
double* preferOverhang1_;
|
|
double* preferOverhang2_;
|
|
double* preferMinWidth_;
|
|
double resPerCut_;
|
|
double diagMinEdgeLength_;
|
|
int numMinSize_;
|
|
double* minSizeWidth_;
|
|
double* minSizeLength_;
|
|
|
|
// 5.7
|
|
double* eolWidth_;
|
|
double* eolWithin_;
|
|
double* parSpace_;
|
|
double* parWithin_;
|
|
double maxArea_;
|
|
int hasLongArray_;
|
|
double viaWidth_;
|
|
double cutSpacing_;
|
|
int numArrayCuts_;
|
|
int arrayCutsAllocated_;
|
|
int* arrayCuts_;
|
|
double* arraySpacings_;
|
|
int hasSpacingTableOrtho_;
|
|
lefiOrthogonal* spacingTableOrtho_;
|
|
double* notchLength_;
|
|
double* endOfNotchWidth_;
|
|
double* minNotchSpacing_;
|
|
double* eonotchLength_;
|
|
|
|
int lef58WidthTableOrthoValues_;
|
|
int lef58WidthTableWrongDirValues_;
|
|
double* lef58WidthTableOrtho_;
|
|
double* lef58WidthTableWrongDir_;
|
|
};
|
|
|
|
END_LEFDEF_PARSER_NAMESPACE
|
|
|
|
USE_LEFDEF_PARSER_NAMESPACE
|
|
|
|
#endif
|