blob: 6e4e353b31368f3c098f3fff1a51ef225fc5acb9 [file] [log] [blame]
// *****************************************************************************
// *****************************************************************************
// Copyright 2012 - 2017, 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$
// $Revision$
// $Date$
// $State: $
// *****************************************************************************
// *****************************************************************************
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef WIN32
# include <unistd.h>
#endif /* not WIN32 */
#include "lefwWriter.hpp"
char defaultOut[128];
// Global variables
FILE* fout;
#define CHECK_STATUS(status) \
if (status) { \
lefwPrintError(status); \
return(status); \
}
int main(int argc, char** argv) {
char* outfile;
int status; // return code, if none 0 means error
int lineNum = 0;
// assign the default
strcpy(defaultOut, "lef.in");
outfile = defaultOut;
fout = stdout;
double *xpath;
double *ypath;
double *xl;
double *yl;
double *wthn, *spng;
int *aspc;
int encrypt = 0;
#ifdef WIN32
// Enable two-digit exponent format
_set_output_format(_TWO_DIGIT_EXPONENT);
#endif
argc--;
argv++;
while (argc--) {
if (strcmp(*argv, "-o") == 0) { // output filename
argv++;
argc--;
outfile = *argv;
if ((fout = fopen(outfile, "w")) == 0) {
fprintf(stderr, "ERROR: could not open output file\n");
return 2;
}
} else if (strncmp(*argv, "-h", 2) == 0) { // compare with -h[elp]
fprintf(stderr, "Usage: lefwrite [-o <filename>] [-e] [-help]\n");
return 1;
} else if (strncmp(*argv, "-e", 2) == 0) { // compare with -e[ncrypt]
encrypt = 1;
} else {
fprintf(stderr, "ERROR: Illegal command line option: '%s'\n", *argv);
return 2;
}
argv++;
}
// initalize
status = lefwInit(fout);
CHECK_STATUS(status);
// set to write an encrypted file
if (encrypt) {
status = lefwEncrypt();
CHECK_STATUS(status);
}
status = lefwVersion(5, 8);
CHECK_STATUS(status);
// status = lefwCaseSensitive("ON"); 5.6
// CHECK_STATUS(status);
// status = lefwNoWireExtensionAtPin("ON"); 5.6
// CHECK_STATUS(status);
status = lefwBusBitChars("<>");
CHECK_STATUS(status);
status = lefwDividerChar(":");
CHECK_STATUS(status);
status = lefwManufacturingGrid(3.5);
CHECK_STATUS(status);
status = lefwFixedMask();
CHECK_STATUS(status);
status = lefwUseMinSpacing("OBS", "OFF");
CHECK_STATUS(status);
// status = lefwUseMinSpacing("PIN", "ON"); 5.6
// CHECK_STATUS(status);
status = lefwClearanceMeasure("EUCLIDEAN");
CHECK_STATUS(status);
// status = lefwClearanceMeasure("MAXXY"); 5.6
// CHECK_STATUS(status);
status = lefwNewLine();
CHECK_STATUS(status);
// 5.4 ANTENNA
status = lefwAntennaInputGateArea(45);
CHECK_STATUS(status);
status = lefwAntennaInOutDiffArea(65);
CHECK_STATUS(status);
status = lefwAntennaOutputDiffArea(55);
CHECK_STATUS(status);
status = lefwNewLine();
CHECK_STATUS(status);
// UNITS
status = lefwStartUnits();
CHECK_STATUS(status);
status = lefwUnits(100, 10, 10000, 10000, 10000, 1000, 20000);
CHECK_STATUS(status);
status = lefwUnitsFrequency(10);
CHECK_STATUS(status);
status = lefwEndUnits();
CHECK_STATUS(status);
// PROPERTYDEFINITIONS
status = lefwStartPropDef();
CHECK_STATUS(status);
status = lefwStringPropDef("LIBRARY", "NAME", 0, 0, "Cadence96");
CHECK_STATUS(status);
status = lefwIntPropDef("LIBRARY", "intNum", 0, 0, 20);
CHECK_STATUS(status);
status = lefwRealPropDef("LIBRARY", "realNum", 0, 0, 21.22);
CHECK_STATUS(status);
status = lefwStringPropDef("PIN", "TYPE", 0, 0, 0);
CHECK_STATUS(status);
status = lefwIntPropDef("PIN", "intProp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwRealPropDef("PIN", "realProp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwStringPropDef("MACRO", "stringProp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwIntPropDef("MACRO", "integerProp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwRealPropDef("MACRO", "WEIGHT", 1.0, 100.0, 0);
CHECK_STATUS(status);
status = lefwStringPropDef("VIA", "stringProperty", 0, 0, 0);
CHECK_STATUS(status);
status = lefwRealPropDef("VIA", "realProp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwIntPropDef("VIA", "COUNT", 1, 100, 0);
CHECK_STATUS(status);
status = lefwStringPropDef("LAYER", "lsp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwIntPropDef("LAYER", "lip", 0, 0, 0);
CHECK_STATUS(status);
status = lefwRealPropDef("LAYER", "lrp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwStringPropDef("VIARULE", "vrsp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwRealPropDef("VIARULE", "vrip", 0, 0, 0);
CHECK_STATUS(status);
status = lefwIntPropDef("VIARULE", "vrrp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwStringPropDef("NONDEFAULTRULE", "ndrsp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwIntPropDef("NONDEFAULTRULE", "ndrip", 0, 0, 0);
CHECK_STATUS(status);
status = lefwRealPropDef("NONDEFAULTRULE", "ndrrp", 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndPropDef();
CHECK_STATUS(status);
// LAYERS
double *current;
double *diffs;
double *ratios;
double *area;
double *width;
current = (double*)malloc(sizeof(double)*15);
diffs = (double*)malloc(sizeof(double)*15);
ratios = (double*)malloc(sizeof(double)*15);
status = lefwStartLayer("POLYS", "MASTERSLICE");
CHECK_STATUS(status);
status = lefwStringProperty("lsp", "top");
CHECK_STATUS(status);
status = lefwIntProperty("lip", 1);
CHECK_STATUS(status);
status = lefwRealProperty("lrp", 2.3);
CHECK_STATUS(status);
status = lefwEndLayer("POLYS");
CHECK_STATUS(status);
status = lefwStartLayer("CUT01", "CUT");
CHECK_STATUS(status);
status = lefwLayerDCCurrentDensity("AVERAGE", 0);
CHECK_STATUS(status);
current[0] = 2.0;
current[1] = 5.0;
current[2] = 10.0;
status = lefwLayerDCCutarea(3, current);
CHECK_STATUS(status);
current[0] = 0.6E-6;
current[1] = 0.5E-6;
current[2] = 0.4E-6;
status = lefwLayerDCTableEntries(3, current);
CHECK_STATUS(status);
status = lefwEndLayer("CUT01");
CHECK_STATUS(status);
status = lefwStartLayerRouting("RX");
CHECK_STATUS(status);
status = lefwLayerRouting("HORIZONTAL", 1);
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.8);
CHECK_STATUS(status);
status = lefwLayerRoutingDiagPitch(1.5);
CHECK_STATUS(status);
status = lefwLayerRoutingDiagWidth(1.0);
CHECK_STATUS(status);
status = lefwLayerRoutingDiagSpacing(0.05);
CHECK_STATUS(status);
status = lefwLayerRoutingDiagMinEdgeLength(0.07);
CHECK_STATUS(status);
status = lefwLayerRoutingArea(34.1);
CHECK_STATUS(status);
xl = (double*)malloc(sizeof(double)*2);
yl = (double*)malloc(sizeof(double)*2);
xl[0] = 0.14;
yl[0] = 0.30;
xl[1] = 0.08;
yl[1] = 0.33;
status = lefwLayerRoutingMinsize(2, xl, yl);
CHECK_STATUS(status);
free((char*)xl);
free((char*)yl);
status = lefwLayerRoutingWireExtension(0.75);
CHECK_STATUS(status);
status = lefwLayerRoutingOffset(0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.6);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRange(0.1, 9);
CHECK_STATUS(status);
status = lefwLayerRoutingResistance("0.103");
CHECK_STATUS(status);
status = lefwLayerRoutingCapacitance("0.000156");
CHECK_STATUS(status);
status = lefwLayerRoutingHeight(9);
CHECK_STATUS(status);
status = lefwLayerRoutingThickness(1);
CHECK_STATUS(status);
status = lefwLayerRoutingShrinkage(0.1);
CHECK_STATUS(status);
status = lefwLayerRoutingEdgeCap(0.00005);
CHECK_STATUS(status);
status = lefwLayerRoutingCapMultiplier(1);
CHECK_STATUS(status);
status = lefwLayerRoutingMinwidth(0.15);
CHECK_STATUS(status);
status = lefwLayerRoutingAntennaArea(1);
CHECK_STATUS(status);
status = lefwLayerAntennaCumAreaRatio(6.7); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaCumRoutingPlusCut(); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaAreaMinusDiff(100.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaGatePlusDiff(2.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaCumDiffAreaRatio(1000); // 5.7
CHECK_STATUS(status);
xl = (double*)malloc(sizeof(double)*5);
yl = (double*)malloc(sizeof(double)*5);
xl[0] = 0.0;
yl[0] = 1.0;
xl[1] = 0.09999;
yl[1] = 1.0;
xl[2] = 0.1;
yl[2] = 0.2;
xl[3] = 1.0;
yl[3] = 0.1;
xl[4] = 100;
yl[4] = 0.1;
status = lefwLayerAntennaAreaDiffReducePwl(5, xl, yl); // 5.7
CHECK_STATUS(status);
free((char*)xl);
free((char*)yl);
status = lefwLayerAntennaCumDiffAreaRatio(1000); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingAntennaLength(1);
CHECK_STATUS(status);
status = lefwLayerDCCurrentDensity("AVERAGE", 10.0);
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("PEAK", 0);
CHECK_STATUS(status);
current[0] = 1E6;
current[1] = 100E6;
current[2] = 400E6;
status = lefwLayerACFrequency(3, current);
CHECK_STATUS(status);
current[0] = 2.0E-6;
current[1] = 1.9E-6;
current[2] = 1.8E-6;
current[3] = 1.7E-6;
current[4] = 1.5E-6;
current[5] = 1.4E-6;
current[6] = 1.3E-6;
current[7] = 1.2E-6;
current[8] = 1.1E-6;
current[9] = 1.0E-6;
current[10] = 0.9E-6;
current[11] = 0.8E-6;
current[12] = 0.7E-6;
current[13] = 0.6E-6;
current[14] = 0.4E-6;
status = lefwLayerACTableEntries(15, current);
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("AVERAGE", 0);
CHECK_STATUS(status);
current[0] = 1E6;
current[1] = 100E6;
current[2] = 400E6;
status = lefwLayerACFrequency(3, current);
CHECK_STATUS(status);
current[0] = 0.6E-6;
current[1] = 0.5E-6;
current[2] = 0.4E-6;
status = lefwLayerACTableEntries(3, current);
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("RMS", 0);
CHECK_STATUS(status);
current[0] = 1E6;
current[1] = 400E6;
current[2] = 800E6;
status = lefwLayerACFrequency(3, current);
CHECK_STATUS(status);
current[0] = 0.4;
current[1] = 0.8;
current[2] = 10.0;
current[3] = 50.0;
current[4] = 100.0;
status = lefwLayerACWidth(5, current);
CHECK_STATUS(status);
current[0] = 2.0E-6;
current[1] = 1.9E-6;
current[2] = 1.8E-6;
current[3] = 1.7E-6;
current[4] = 1.5E-6;
current[5] = 1.4E-6;
current[6] = 1.3E-6;
current[7] = 1.2E-6;
current[8] = 1.1E-6;
current[9] = 1.0E-6;
current[10] = 0.9E-6;
current[11] = 0.8E-6;
current[12] = 0.7E-6;
current[13] = 0.6E-6;
current[14] = 0.4E-6;
status = lefwLayerACTableEntries(15, current);
CHECK_STATUS(status);
status = lefwEndLayerRouting("RX");
CHECK_STATUS(status);
status = lefwStartLayer("CUT12", "CUT");
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.7);
CHECK_STATUS(status);
status = lefwLayerCutSpacingLayer("RX", 0);
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd();
CHECK_STATUS(status);
status = lefwLayerResistancePerCut(8.0);
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.22); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingAdjacent(3, 0.25, 0); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(1.5); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingParallel(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(1.2); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingAdjacent(2, 1.5, 0); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaModel("OXIDE1");
CHECK_STATUS(status);
status = lefwLayerAntennaAreaRatio(5.6);
CHECK_STATUS(status);
status = lefwLayerAntennaDiffAreaRatio(6.5);
CHECK_STATUS(status);
status = lefwLayerAntennaAreaFactor(5.4, 0);
CHECK_STATUS(status);
status = lefwLayerAntennaCumDiffAreaRatio(4.5);
CHECK_STATUS(status);
diffs[0] = 5.4;
ratios[0] = 5.4;
diffs[1] = 6.5;
ratios[1] = 6.5;
diffs[2] = 7.5;
ratios[2] = 7.5;
status = lefwLayerAntennaCumDiffAreaRatioPwl(3, diffs, ratios);
CHECK_STATUS(status);
status = lefwLayerAntennaCumAreaRatio(6.7);
CHECK_STATUS(status);
status = lefwLayerAntennaModel("OXIDE2");
CHECK_STATUS(status);
status = lefwLayerAntennaCumAreaRatio(300);
CHECK_STATUS(status);
status = lefwLayerAntennaCumRoutingPlusCut(); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaAreaMinusDiff(100.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaGatePlusDiff(2.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaDiffAreaRatio(1000); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaCumDiffAreaRatio(5000); // 5.7
CHECK_STATUS(status);
xl = (double*)malloc(sizeof(double)*5);
yl = (double*)malloc(sizeof(double)*5);
xl[0] = 0.0;
yl[0] = 1.0;
xl[1] = 0.09999;
yl[1] = 1.0;
xl[2] = 0.1;
yl[2] = 0.2;
xl[3] = 1.0;
yl[3] = 0.1;
xl[4] = 100;
yl[4] = 0.1;
status = lefwLayerAntennaAreaDiffReducePwl(5, xl, yl); // 5.7
CHECK_STATUS(status);
free((char*)xl);
free((char*)yl);
diffs[0] = 1;
ratios[0] = 4;
diffs[1] = 2;
ratios[1] = 5;
status = lefwLayerAntennaCumDiffAreaRatioPwl(2, diffs, ratios);
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("PEAK", 0);
CHECK_STATUS(status);
current[0] = 1E6;
current[1] = 100E6;
status = lefwLayerACFrequency(2, current);
CHECK_STATUS(status);
current[0] = 0.5E-6;
current[1] = 0.4E-6;
status = lefwLayerACTableEntries(2, current);
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("AVERAGE", 0);
CHECK_STATUS(status);
current[0] = 1E6;
current[1] = 100E6;
status = lefwLayerACFrequency(2, current);
CHECK_STATUS(status);
current[0] = 0.6E-6;
current[1] = 0.5E-6;
status = lefwLayerACTableEntries(2, current);
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("RMS", 0);
CHECK_STATUS(status);
current[0] = 100E6;
current[1] = 800E6;
status = lefwLayerACFrequency(2, current);
CHECK_STATUS(status);
current[0] = 0.5E-6;
current[1] = 0.4E-6;
status = lefwLayerACTableEntries(2, current);
CHECK_STATUS(status);
status = lefwEndLayer("CUT12");
CHECK_STATUS(status);
status = lefwStartLayerRouting("PC");
CHECK_STATUS(status);
status = lefwLayerRouting("DIAG45", 1);
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.8);
CHECK_STATUS(status);
status = lefwLayerRoutingWireExtension(0.4);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.6);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(1.2); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingEndOfLine(1.3, 0.6); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(1.3); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingEndOfLine(1.4, 0.7); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingEOLParallel(1.1, 0.5, 1); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(1.4); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingEndOfLine(1.5, 0.8); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingEOLParallel(1.2, 0.6, 0); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingOffsetXYDistance(0.9, 0.7);
CHECK_STATUS(status);
status = lefwLayerRoutingResistance("PWL ( ( 1 0.103 ) )");
CHECK_STATUS(status);
status = lefwLayerRoutingCapacitance("PWL ( ( 1 0.000156 ) ( 10 0.001 ) )");
CHECK_STATUS(status);
status = lefwLayerAntennaAreaRatio(5.4);
CHECK_STATUS(status);
status = lefwLayerAntennaDiffAreaRatio(6.5);
CHECK_STATUS(status);
diffs[0] = 4.0;
ratios[0] = 4.1;
diffs[1] = 4.2;
ratios[1] = 4.3;
status = lefwLayerAntennaDiffAreaRatioPwl(2, diffs, ratios);
CHECK_STATUS(status);
status = lefwLayerAntennaCumAreaRatio(7.5);
CHECK_STATUS(status);
diffs[0] = 5.0;
ratios[0] = 5.1;
diffs[1] = 6.0;
ratios[1] = 6.1;
status = lefwLayerAntennaCumDiffAreaRatioPwl(2, diffs, ratios);
CHECK_STATUS(status);
status = lefwLayerAntennaAreaFactor(4.5, 0);
CHECK_STATUS(status);
status = lefwLayerAntennaSideAreaRatio(6.5);
CHECK_STATUS(status);
status = lefwLayerAntennaCumDiffSideAreaRatio(4.6);
CHECK_STATUS(status);
diffs[0] = 8.0;
ratios[0] = 8.1;
diffs[1] = 8.2;
ratios[1] = 8.3;
diffs[2] = 8.4;
ratios[2] = 8.5;
diffs[3] = 8.6;
ratios[3] = 8.7;
status = lefwLayerAntennaCumDiffSideAreaRatioPwl(4, diffs, ratios);
CHECK_STATUS(status);
status = lefwLayerAntennaCumSideAreaRatio(7.4);
CHECK_STATUS(status);
diffs[0] = 7.0;
ratios[0] = 7.1;
diffs[1] = 7.2;
ratios[1] = 7.3;
status = lefwLayerAntennaDiffSideAreaRatioPwl(2, diffs, ratios);
CHECK_STATUS(status);
status = lefwLayerAntennaSideAreaFactor(9.0, "DIFFUSEONLY");
CHECK_STATUS(status);
status = lefwLayerACCurrentDensity("PEAK", 10.0);
CHECK_STATUS(status);
status = lefwLayerDCCurrentDensity("AVERAGE", 0);
CHECK_STATUS(status);
current[0] = 20.0;
current[1] = 50.0;
current[2] = 100.0;
status = lefwLayerDCWidth(3, current);
CHECK_STATUS(status);
current[0] = 1.0E-6;
current[1] = 0.7E-6;
current[2] = 0.5E-6;
status = lefwLayerDCTableEntries(3, current);
CHECK_STATUS(status);
status = lefwEndLayerRouting("PC");
CHECK_STATUS(status);
status = lefwStartLayer("CA", "CUT");
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.15); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingCenterToCenter(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerEnclosure("BELOW", 0.3, 0.01, 0);
CHECK_STATUS(status);
status = lefwLayerEnclosure("ABOVE", 0.5, 0.01, 0);
CHECK_STATUS(status);
status = lefwLayerPreferEnclosure("BELOW", 0.06, 0.01, 0);
CHECK_STATUS(status);
status = lefwLayerPreferEnclosure("ABOVE", 0.08, 0.02, 0);
CHECK_STATUS(status);
status = lefwLayerEnclosure("", 0.02, 0.02, 1.0);
CHECK_STATUS(status);
status = lefwLayerEnclosure(NULL, 0.05, 0.05, 2.0);
CHECK_STATUS(status);
status = lefwLayerEnclosure("BELOW", 0.07, 0.07, 1.0);
CHECK_STATUS(status);
status = lefwLayerEnclosure("ABOVE", 0.09, 0.09, 1.0);
CHECK_STATUS(status);
status = lefwLayerResistancePerCut(10.0);
CHECK_STATUS(status);
status = lefwLayerDCCurrentDensity("AVERAGE", 0);
CHECK_STATUS(status);
current[0] = 2.0;
current[1] = 5.0;
current[2] = 10.0;
status = lefwLayerDCWidth(3, current);
CHECK_STATUS(status);
current[0] = 0.6E-6;
current[1] = 0.5E-6;
current[2] = 0.4E-6;
status = lefwLayerDCTableEntries(3, current);
CHECK_STATUS(status);
status = lefwEndLayer("CA");
CHECK_STATUS(status);
status = lefwStartLayerRouting("M1");
CHECK_STATUS(status);
status = lefwLayerRouting("DIAG135", 1);
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.8);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.6);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRange(1.1, 100.1);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRangeUseLengthThreshold();
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.61);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRange(1.1, 100.1);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRangeInfluence(2.01, 2.0, 1000.0);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.62);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRange(1.1, 100.1);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingRangeRange(4.1, 6.5);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.63);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingLengthThreshold(1.34, 4.5, 6.5);
CHECK_STATUS(status);
status = lefwLayerRoutingWireExtension(7);
CHECK_STATUS(status);
status = lefwLayerRoutingResistance("0.103");
CHECK_STATUS(status);
status = lefwLayerRoutingCapacitance("0.000156");
CHECK_STATUS(status);
current[0] = 0.00;
current[1] = 0.50;
current[2] = 3.00;
current[3] = 5.00;
status = lefwLayerRoutingStartSpacingtableParallel(4, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.15;
current[2] = 0.15;
current[3] = 0.15;
status = lefwLayerRoutingSpacingtableParallelWidth(0.00, 4, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.20;
current[2] = 0.20;
current[3] = 0.20;
status = lefwLayerRoutingSpacingtableParallelWidth(0.25, 4, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.50;
current[2] = 0.50;
current[3] = 0.50;
status = lefwLayerRoutingSpacingtableParallelWidth(1.50, 4, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.50;
current[2] = 1.00;
current[3] = 1.00;
status = lefwLayerRoutingSpacingtableParallelWidth(3.00, 4, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.50;
current[2] = 1.00;
current[3] = 2.00;
status = lefwLayerRoutingSpacingtableParallelWidth(5.00, 4, current);
CHECK_STATUS(status);
status = lefwLayerRoutineEndSpacingtable();
CHECK_STATUS(status);
status = lefwLayerRoutingStartSpacingtableInfluence();
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingInfluenceWidth(1.5, 0.5, 0.5);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingInfluenceWidth(3.0, 1.0, 1.0);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingInfluenceWidth(5.0, 2.0, 2.0);
CHECK_STATUS(status);
status = lefwLayerRoutineEndSpacingtable();
CHECK_STATUS(status);
status = lefwLayerRoutingStartSpacingtableInfluence();
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingInfluenceWidth(1.5, 0.5, 0.5);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingInfluenceWidth(5.0, 2.0, 2.0);
CHECK_STATUS(status);
status = lefwLayerRoutineEndSpacingtable();
CHECK_STATUS(status);
current[0] = 0.00;
current[1] = 0.50;
current[2] = 5.00;
status = lefwLayerRoutingStartSpacingtableParallel(3, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.15;
current[2] = 0.15;
status = lefwLayerRoutingSpacingtableParallelWidth(0.00, 3, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.20;
current[2] = 0.20;
status = lefwLayerRoutingSpacingtableParallelWidth(0.25, 3, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.50;
current[2] = 1.00;
status = lefwLayerRoutingSpacingtableParallelWidth(3.00, 3, current);
CHECK_STATUS(status);
current[0] = 0.15;
current[1] = 0.50;
current[2] = 2.00;
status = lefwLayerRoutingSpacingtableParallelWidth(5.00, 3, current);
CHECK_STATUS(status);
status = lefwLayerRoutineEndSpacingtable();
CHECK_STATUS(status);
free((char*)current);
free((char*)diffs);
free((char*)ratios);
status = lefwLayerAntennaGatePlusDiff(2.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaDiffAreaRatio(1000); // 5.7
CHECK_STATUS(status);
status = lefwLayerAntennaCumDiffAreaRatio(5000); // 5.7
CHECK_STATUS(status);
status = lefwEndLayerRouting("M1");
CHECK_STATUS(status);
status = lefwStartLayer("V1", "CUT");
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.6);
CHECK_STATUS(status);
status = lefwLayerCutSpacingLayer("CA", 0);
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd();
CHECK_STATUS(status);
status = lefwEndLayer("V1");
CHECK_STATUS(status);
status = lefwStartLayerRouting("M2");
CHECK_STATUS(status);
status = lefwLayerRouting("VERTICAL", 0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.8);
CHECK_STATUS(status);
status = lefwLayerRoutingWireExtension(8);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingLengthThreshold(100.9, 0, 0);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.5);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingLengthThreshold(0.9, 0, 0.1);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.6);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingLengthThreshold(1.9, 0, 0);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(1.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingSameNet(1); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(1.1); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingSameNet(0); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingResistance("0.0608");
CHECK_STATUS(status);
status = lefwLayerRoutingCapacitance("0.000184");
CHECK_STATUS(status);
status = lefwEndLayerRouting("M2");
CHECK_STATUS(status);
status = lefwStartLayer("V2", "CUT");
CHECK_STATUS(status);
status = lefwEndLayer("V2");
CHECK_STATUS(status);
status = lefwStartLayerRouting("M3");
CHECK_STATUS(status);
status = lefwLayerRouting("HORIZONTAL", 0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingPitchXYDistance(1.8, 1.5);
CHECK_STATUS(status);
status = lefwLayerRoutingDiagPitchXYDistance(1.5, 1.8);
CHECK_STATUS(status);
status = lefwLayerRoutingWireExtension(8);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingResistance("0.0608");
CHECK_STATUS(status);
status = lefwLayerRoutingCapacitance("0.000184");
CHECK_STATUS(status);
status = lefwEndLayerRouting("M3");
CHECK_STATUS(status);
area = (double*)malloc(sizeof(double)*3);
width = (double*)malloc(sizeof(double)*3);
status = lefwStartLayerRouting("M4");
CHECK_STATUS(status);
status = lefwLayerRouting("HORIZONTAL", 0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcut(2, 0.50);
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcut(2, 0.70);
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcutConnections("FROMBELOW");
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcut(4, 1.0);
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcutConnections("FROMABOVE");
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcut(2, 1.1);
CHECK_STATUS(status);
status = lefwLayerRoutingMinimumcutLengthWithin(20.0, 5.0);
CHECK_STATUS(status);
area[0] = 0.40;
width[0] = 0;
area[1] = 0.40;
width[1] = 0.15;
area[2] = 0.80;
width[2] = 0.50;
status = lefwLayerRoutingMinenclosedarea(3, area, width);
CHECK_STATUS(status);
status = lefwLayerRoutingMaxwidth(10.0);
CHECK_STATUS(status);
status = lefwLayerRoutingProtrusion(0.30, 0.60, 1.20);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstep(0.20);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstep(0.05);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.05, NULL, 0.08);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.05, NULL, 0.16);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.05, "INSDECORNER", 0);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.05, "INSIDECORNER", 0.15);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.05, "STEP", 0);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.05, "STEP", 0.08);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepWithOptions(0.04, "STEP", 0);
CHECK_STATUS(status);
status = lefwLayerRoutingMinstepMaxEdges(1.0, 2); // 5.7
CHECK_STATUS(status);
status = lefwEndLayerRouting("M4");
CHECK_STATUS(status);
free((char*)area);
free((char*)width);
status = lefwStartLayer("implant1", "IMPLANT");
CHECK_STATUS(status);
status = lefwLayerWidth(0.50);
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.50);
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd();
CHECK_STATUS(status);
status = lefwEndLayer("implant1");
CHECK_STATUS(status);
status = lefwStartLayer("implant2", "IMPLANT");
CHECK_STATUS(status);
status = lefwLayerWidth(0.50);
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.50);
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd();
CHECK_STATUS(status);
status = lefwEndLayer("implant2");
CHECK_STATUS(status);
status = lefwStartLayer("V3", "CUT");
CHECK_STATUS(status);
status = lefwLayerMask(2);
CHECK_STATUS(status);
status = lefwLayerWidth(0.60);
CHECK_STATUS(status);
status = lefwEndLayer("V3");
CHECK_STATUS(status);
status = lefwStartLayerRouting("MT");
CHECK_STATUS(status);
status = lefwLayerRouting("VERTICAL", 0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.8);
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.9);
CHECK_STATUS(status);
status = lefwLayerRoutingResistance("0.0608");
CHECK_STATUS(status);
status = lefwLayerRoutingCapacitance("0.000184");
CHECK_STATUS(status);
status = lefwEndLayerRouting("MT");
CHECK_STATUS(status);
status = lefwStartLayer("OVERLAP", "OVERLAP");
CHECK_STATUS(status);
status = lefwEndLayer("OVERLAP");
CHECK_STATUS(status);
status = lefwStartLayerRouting("MET2");
CHECK_STATUS(status);
status = lefwLayerRouting("VERTICAL", 0.9);
CHECK_STATUS(status);
status = lefwLayerMask(2);
CHECK_STATUS(status);
status = lefwMinimumDensity(20.2);
CHECK_STATUS(status);
status = lefwMaximumDensity(80.0);
CHECK_STATUS(status);
status = lefwDensityCheckWindow(200.0, 200.0);
CHECK_STATUS(status);
status = lefwDensityCheckStep(100.0);
CHECK_STATUS(status);
status = lefwFillActiveSpacing(3.0);
CHECK_STATUS(status);
status = lefwEndLayerRouting("MET2");
CHECK_STATUS(status);
status = lefwStartLayer("via34", "CUT"); // 5.7
CHECK_STATUS(status);
status = lefwLayerWidth(0.25); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.1); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingCenterToCenter(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerEnclosure(0, .05, .01, 0); // 5.7
CHECK_STATUS(status);
status = lefwLayerEnclosureLength(0, .05, 0, 0.7); // 5.7
CHECK_STATUS(status);
status = lefwLayerEnclosure("BELOW", .07, .07, 1.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerEnclosure("ABOVE", .09, .09, 1.0); // 5.7
CHECK_STATUS(status);
status = lefwLayerEnclosureWidth(0, .03, .03, 1.0, 0.2); // 5.7
CHECK_STATUS(status);
status = lefwEndLayer("via34"); // 5.7
CHECK_STATUS(status);
status = lefwStartLayer("cut23", "CUT"); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.20); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingSameNet(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingLayer("cut12", 1); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.30); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingCenterToCenter(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingSameNet(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingArea(0.02); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.40); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingArea(0.5); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacing(0.10); // 5.7
CHECK_STATUS(status);
status = lefwLayerCutSpacingEnd(); // 5.7
CHECK_STATUS(status);
wthn = (double*)malloc(sizeof(double)*3); // 5.7
spng = (double*)malloc(sizeof(double)*3);
aspc = (int*)malloc(sizeof(int)*3);
wthn[0] = 0.15;
spng[0] = 0.11;
wthn[1] = 0.13;
spng[1] = 0.13;
wthn[2] = 0.11;
spng[2] = 0.15;
status = lefwLayerCutSpacingTableOrtho(3, wthn, spng);
CHECK_STATUS(status);
aspc[0] = 3;
spng[0] = 1;
status = lefwLayerArraySpacing(0, 2.0, 0.2, 1, aspc, spng);
CHECK_STATUS(status);
aspc[0] = 3;
spng[0] = 1;
aspc[1] = 4;
spng[1] = 1.5;
aspc[2] = 5;
spng[2] = 2.0;
status = lefwLayerArraySpacing(1, 2.0, 0.2, 3, aspc, spng);
CHECK_STATUS(status);
free((char*)wthn);
free((char*)spng);
free((char*)aspc);
status = lefwEndLayer("cut23");
CHECK_STATUS(status);
status = lefwStartLayerRouting("cut24"); // 5.7
CHECK_STATUS(status);
status = lefwLayerRouting("HORIZONTAL", 1); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.2); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.10); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.12); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingNotchLength(0.15); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacing(0.14); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingSpacingEndOfNotchWidth(0.15, 0.16, 0.08); // 5.7
CHECK_STATUS(status);
status = lefwEndLayerRouting("cut24"); // 5.7
CHECK_STATUS(status);
status = lefwStartLayerRouting("cut25"); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingPitch(1.2); // 5.7
CHECK_STATUS(status);
status = lefwLayerRouting("HORIZONTAL", 1); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingWireExtension(7); // 5.7
CHECK_STATUS(status);
status = lefwLayerRoutingStartSpacingtableTwoWidths(); // 5.7
CHECK_STATUS(status);
wthn = (double*)malloc(sizeof(double)*4); // 5.7
wthn[0] = 0.15;
wthn[1] = 0.20;
wthn[2] = 0.50;
wthn[3] = 1.00;
status = lefwLayerRoutingSpacingtableTwoWidthsWidth(0.0, 0, 4, wthn); // 5.7
CHECK_STATUS(status);
wthn[0] = 0.20;
wthn[1] = 0.25;
wthn[2] = 0.50;
wthn[3] = 1.00;
status = lefwLayerRoutingSpacingtableTwoWidthsWidth(0.25, 0.1, 4, wthn);// 5.7
CHECK_STATUS(status);
wthn[0] = 0.50;
wthn[1] = 0.50;
wthn[2] = 0.60;
wthn[3] = 1.00;
status = lefwLayerRoutingSpacingtableTwoWidthsWidth(1.5, 1.5, 4, wthn);// 5.7
CHECK_STATUS(status);
wthn[0] = 1.00;
wthn[1] = 1.00;
wthn[2] = 1.00;
wthn[3] = 1.20;
status = lefwLayerRoutingSpacingtableTwoWidthsWidth(3.0, 3.0, 4, wthn);// 5.7
CHECK_STATUS(status);
free(wthn);
status = lefwLayerRoutineEndSpacingtable();
CHECK_STATUS(status);
status = lefwEndLayerRouting("cut25"); // 5.7
CHECK_STATUS(status);
// MAXVIASTACK
status = lefwMaxviastack(4, "m1", "m7");
CHECK_STATUS(status);
// VIA
status = lefwStartVia("RX_PC", "DEFAULT");
CHECK_STATUS(status);
status = lefwViaResistance(2);
CHECK_STATUS(status);
status = lefwViaLayer("RX");
CHECK_STATUS(status);
status = lefwViaLayerRect(-0.7, -0.7, 0.7, 0.7, 3);
CHECK_STATUS(status);
status = lefwViaLayer("CUT12");
CHECK_STATUS(status);
status = lefwViaLayerRect(-0.25, -0.25, 0.25, 0.25);
CHECK_STATUS(status);
status = lefwViaLayer("PC");
CHECK_STATUS(status);
status = lefwViaLayerRect(-0.6, -0.6, 0.6, 0.6, 2);
CHECK_STATUS(status);
status = lefwStringProperty("stringProperty", "DEFAULT");
CHECK_STATUS(status);
status = lefwRealProperty("realProperty", 32.33);
CHECK_STATUS(status);
status = lefwIntProperty("COUNT", 34);
CHECK_STATUS(status);
status = lefwEndVia("PC");
CHECK_STATUS(status);
status = lefwStartVia("M2_M3_PWR", NULL);
CHECK_STATUS(status);
status = lefwViaResistance(0.4);
CHECK_STATUS(status);
status = lefwViaLayer("M2");
CHECK_STATUS(status);
status = lefwViaLayerRect(-1.35, -1.35, 1.35, 1.35);
CHECK_STATUS(status);
status = lefwViaLayer("V2");
CHECK_STATUS(status);
status = lefwViaLayerRect(-1.35, -1.35, -0.45, 1.35);
CHECK_STATUS(status);
status = lefwViaLayerRect(0.45, -1.35, 1.35, -0.45);
CHECK_STATUS(status);
status = lefwViaLayerRect(0.45, 0.45, 1.35, 1.35);
CHECK_STATUS(status);
status = lefwViaLayer("M3");
CHECK_STATUS(status);
status = lefwViaLayerRect(-1.35, -1.35, 1.35, 1.35);
CHECK_STATUS(status);
status = lefwEndVia("M2_M3_PWR");
CHECK_STATUS(status);
xl = (double*)malloc(sizeof(double)*6);
yl = (double*)malloc(sizeof(double)*6);
status = lefwStartVia("IN1X", 0);
CHECK_STATUS(status);
// status = lefwViaTopofstackonly(); 5.6
// CHECK_STATUS(status);
// status = lefwViaForeign("IN1X", 0, 0, -1); 5.6
// CHECK_STATUS(status);
status = lefwViaLayer("metal2");
CHECK_STATUS(status);
xl[0] = -2.1;
yl[0] = -1.0;
xl[1] = -0.2;
yl[1] = 1.0;
xl[2] = 2.1;
yl[2] = 1.0;
xl[3] = 0.2;
yl[3] = -1.0;
xl[4] = 0.2;
yl[4] = -1.0;
xl[5] = 0.2;
yl[5] = -1.0;
status = lefwViaLayerPolygon(6, xl, yl, 2);
CHECK_STATUS(status);
xl[0] = -1.1;
yl[0] = -2.0;
xl[1] = -0.1;
yl[1] = 2.0;
xl[2] = 1.1;
yl[2] = 2.0;
xl[3] = 0.1;
yl[3] = -2.0;
status = lefwViaLayerPolygon(4, xl, yl, 1);
CHECK_STATUS(status);
xl[0] = -3.1;
yl[0] = -2.0;
xl[1] = -0.3;
yl[1] = 2.0;
xl[2] = 3.1;
yl[2] = 2.0;
xl[3] = 0.3;
yl[3] = -2.0;
status = lefwViaLayerPolygon(4, xl, yl);
CHECK_STATUS(status);
xl[0] = -4.1;
yl[0] = -2.0;
xl[1] = -0.4;
yl[1] = 2.0;
xl[2] = 4.1;
yl[2] = 2.0;
xl[3] = 0.4;
yl[3] = -2.0;
status = lefwViaLayerPolygon(4, xl, yl);
CHECK_STATUS(status);
status = lefwViaLayer("cut23");
CHECK_STATUS(status);
status = lefwViaLayerRect(-0.4, -0.4, 0.4, 0.4);
CHECK_STATUS(status);
xl[0] = -2.1;
yl[0] = -1.0;
xl[1] = -0.2;
yl[1] = 1.0;
xl[2] = 2.1;
yl[2] = 1.0;
xl[3] = 0.2;
yl[3] = -1.0;
status = lefwViaLayerPolygon(4, xl, yl);
CHECK_STATUS(status);
status = lefwEndVia("IN1X");
CHECK_STATUS(status);
status = lefwStartVia("myBlockVia", NULL);
CHECK_STATUS(status);
status = lefwViaViarule("DEFAULT", 0.1, 0.1, "metal1", "via12", "metal2",
0.1, 0.1, 0.05, 0.01, 0.01, 0.05);
CHECK_STATUS(status);
status = lefwViaViaruleRowCol(1, 2);
CHECK_STATUS(status);
status = lefwViaViaruleOrigin(1.5, 2.5);
CHECK_STATUS(status);
status = lefwViaViaruleOffset(1.5, 2.5, 3.5, 4.5);
CHECK_STATUS(status);
status = lefwViaViarulePattern("2_1RF1RF1R71R0_3_R1FFFF");
CHECK_STATUS(status);
status = lefwEndVia("myBlockVia");
CHECK_STATUS(status);
status = lefwStartVia("myVia23", NULL);
CHECK_STATUS(status);
status = lefwViaLayer("metal2");
CHECK_STATUS(status);
status = lefwViaLayerPolygon(6, xl, yl);
CHECK_STATUS(status);
status = lefwViaLayer("cut23");
CHECK_STATUS(status);
status = lefwViaLayerRect(-0.4, -0.4, 0.4, 0.4);
CHECK_STATUS(status);
status = lefwViaLayer("metal3");
CHECK_STATUS(status);
status = lefwViaLayerPolygon(5, xl, yl);
CHECK_STATUS(status);
status = lefwEndVia("myVia23");
CHECK_STATUS(status);
free((char*)xl);
free((char*)yl);
// VIARULE
status = lefwStartViaRule("VIALIST12");
CHECK_STATUS(status);
lefwAddComment("Break up the old lefwViaRule into 2 routines");
lefwAddComment("lefwViaRuleLayer and lefwViaRuleVia");
// status = lefwViaRuleLayer("M1", "VERTICAL", 9.0, 9.6, 4.5, 0); 5.6
// CHECK_STATUS(status);
// status = lefwViaRuleLayer("M2", "HORIZONTAL", 3.0, 3.0, 0, 0); 5.6
// CHECK_STATUS(status);
status = lefwViaRuleLayer("M1", NULL, 9.0, 9.6, 0, 0);
CHECK_STATUS(status);
status = lefwViaRuleLayer("M2", NULL, 3.0, 3.0, 0, 0);
CHECK_STATUS(status);
status = lefwViaRuleVia("VIACENTER12");
CHECK_STATUS(status);
status = lefwStringProperty("vrsp", "new");
CHECK_STATUS(status);
status = lefwIntProperty("vrip", 1);
CHECK_STATUS(status);
status = lefwRealProperty("vrrp", 4.5);
CHECK_STATUS(status);
status = lefwEndViaRule("VIALIST12");
CHECK_STATUS(status);
// VIARULE with GENERATE
lefwAddComment("Break up the old lefwViaRuleGenearte into 4 routines");
lefwAddComment("lefwStartViaRuleGen, lefwViaRuleGenLayer,");
lefwAddComment("lefwViaRuleGenLayer3, and lefwEndViaRuleGen");
status = lefwStartViaRuleGen("VIAGEN12");
CHECK_STATUS(status);
// status = lefwViaRuleGenLayer("M1", "VERTICAL", 0.1, 19, 1.4, 0); 5.6
// CHECK_STATUS(status);
// status = lefwViaRuleGenLayer("M2", "HORIZONTAL", 0, 0, 1.4, 0); 5.6
// CHECK_STATUS(status);
status = lefwViaRuleGenLayer("M1", NULL, 0.1, 19, 0, 0);
CHECK_STATUS(status);
status = lefwViaRuleGenLayer("M2", NULL, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwViaRuleGenLayer3("V1", -0.8, -0.8, 0.8, 0.8, 5.6, 6.0, 0.2);
CHECK_STATUS(status);
status = lefwEndViaRuleGen("VIAGEN12");
CHECK_STATUS(status);
// VIARULE with GENERATE & ENCLOSURE & DEFAULT
status = lefwStartViaRuleGen("via12");
CHECK_STATUS(status);
status = lefwViaRuleGenDefault();
CHECK_STATUS(status);
status = lefwViaRuleGenLayerEnclosure("m1", 0.05, 0.005, 1.0, 100.0);
CHECK_STATUS(status);
status = lefwViaRuleGenLayerEnclosure("m2", 0.05, 0.005, 1.0, 100.0);
CHECK_STATUS(status);
status = lefwViaRuleGenLayer3("cut12", -0.07, -0.07, 0.07, 0.07, 0.16, 0.16, 0);
CHECK_STATUS(status);
status = lefwEndViaRuleGen("via12");
CHECK_STATUS(status);
// NONDEFAULTRULE
status = lefwStartNonDefaultRule("RULE1");
CHECK_STATUS(status);
status = lefwNonDefaultRuleHardspacing();
CHECK_STATUS(status);
// status = lefwNonDefaultRuleLayer("RX", 10.0, 2.2, 6, 6.5, 6.5, 6.5); 5.6
// CHECK_STATUS(status);
// status = lefwNonDefaultRuleLayer("PC", 10.0, 2.2, 0, 0, 6.5, 0); 5.6
// CHECK_STATUS(status);
// status = lefwNonDefaultRuleLayer("M1", 10.0, 2.2, 0, 6.5, 0, 0); 5.6
// CHECK_STATUS(status);
status = lefwNonDefaultRuleLayer("RX", 10.0, 2.2, 6, 0, 0, 0);
CHECK_STATUS(status);
status = lefwNonDefaultRuleLayer("PC", 10.0, 2.2, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwNonDefaultRuleLayer("M1", 10.0, 2.2, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwStartVia("nd1VARX0", NULL);
CHECK_STATUS(status);
status = lefwViaResistance(0.2);
CHECK_STATUS(status);
// status = lefwViaForeignStr("IN1X", 0, 0, "N"); 5.6
// CHECK_STATUS(status);
status = lefwViaLayer("RX");
CHECK_STATUS(status);
status = lefwViaLayerRect(-3, -3, 3, 3);
CHECK_STATUS(status);
status = lefwViaLayer("CUT12");
CHECK_STATUS(status);
status = lefwViaLayerRect(-1.0, -1.0, 1.0, 1.0);
CHECK_STATUS(status);
status = lefwViaLayer("PC");
CHECK_STATUS(status);
status = lefwViaLayerRect(-3, -3, 3, 3);
CHECK_STATUS(status);
status = lefwEndVia("nd1VARX0");
CHECK_STATUS(status);
status = lefwStartSpacing();
CHECK_STATUS(status);
status = lefwSpacing("CUT01", "RX", 0.1, "STACK");
CHECK_STATUS(status);
status = lefwEndSpacing();
CHECK_STATUS(status);
status = lefwEndNonDefaultRule("RULE1");
CHECK_STATUS(status);
status = lefwStartNonDefaultRule("wide1_5x");
CHECK_STATUS(status);
status = lefwNonDefaultRuleLayer("fw", 4.8, 4.8, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwNonDefaultRuleStartVia("nd1VIARX0", "DEFAULT");
CHECK_STATUS(status);
// status = lefwViaTopofstackonly(); 5.6
// CHECK_STATUS(status);
// status = lefwViaForeign("IN1X", 0, 0, -1); 5.6
// CHECK_STATUS(status);
status = lefwViaResistance(0.2);
CHECK_STATUS(status);
status = lefwViaLayer("RX");
CHECK_STATUS(status);
status = lefwViaLayerRect(-3, -3, 3, 3);
CHECK_STATUS(status);
status = lefwViaLayer("CUT12");
CHECK_STATUS(status);
status = lefwViaLayerRect(-1.0, -1.0, 1.0, 1.0);
CHECK_STATUS(status);
status = lefwViaLayer("PC");
CHECK_STATUS(status);
status = lefwViaLayerRect(-3, -3, 3, 3);
CHECK_STATUS(status);
status = lefwNonDefaultRuleEndVia("nd1VIARX0");
CHECK_STATUS(status);
status = lefwNonDefaultRuleUseVia("via12_fixed_analog_via");
CHECK_STATUS(status);
status = lefwNonDefaultRuleMinCuts("cut12", 2);
CHECK_STATUS(status);
status = lefwNonDefaultRuleUseVia("via23_fixed_analog_via");
CHECK_STATUS(status);
status = lefwNonDefaultRuleMinCuts("cut23", 2);
CHECK_STATUS(status);
status = lefwNonDefaultRuleUseViaRule("viaRule23_fixed_analog_via");
CHECK_STATUS(status);
status = lefwEndNonDefaultRule("wide1_5x");
CHECK_STATUS(status);
// UNIVERSALNOISEMARGIN
/* obsolete in 5.4
status = lefwUniversalNoiseMargin(0.1, 20);
CHECK_STATUS(status);
status = lefwEdgeRateThreshold1(0.1);
CHECK_STATUS(status);
status = lefwEdgeRateThreshold2(0.9);
CHECK_STATUS(status);
status = lefwEdgeRateScaleFactor(1.0);
CHECK_STATUS(status);
*/
// NOISETABLE
/* obsolete in 5.4
double *holder;
holder = (double*)malloc(sizeof(double)*1);
status = lefwStartNoiseTable(1);
CHECK_STATUS(status);
status = lefwEdgeRate(20);
CHECK_STATUS(status);
holder[0] = 3;
status = lefwOutputResistance(1, holder);
CHECK_STATUS(status);
holder[0] = 10;
status = lefwVictims(25, 1, holder);
CHECK_STATUS(status);
status = lefwEndNoiseTable();
CHECK_STATUS(status);
*/
// CORRECTIONTABLE
/* obsolete in 5.4
status = lefwStartCorrectTable(1);
CHECK_STATUS(status);
status = lefwEdgeRate(20);
CHECK_STATUS(status);
holder[0] = 3;
status = lefwOutputResistance(1, holder); // Share the same functions with
CHECK_STATUS(status); // noisetable
holder[0] = 10.5;
status = lefwVictims(25, 1, holder);
CHECK_STATUS(status);
status = lefwEndCorrectTable();
CHECK_STATUS(status);
free((char*)holder);
*/
// SPACING
status = lefwStartSpacing();
CHECK_STATUS(status);
status = lefwSpacing("CUT01", "CA", 1.5, NULL);
CHECK_STATUS(status);
status = lefwSpacing("CA", "V1", 1.5, "STACK");
CHECK_STATUS(status);
status = lefwSpacing("M1", "M1", 3.5, "STACK");
CHECK_STATUS(status);
status = lefwSpacing("V1", "V2", 1.5, "STACK");
CHECK_STATUS(status);
status = lefwSpacing("M2", "M2", 3.5, "STACK");
CHECK_STATUS(status);
status = lefwSpacing("V2", "V3", 1.5, "STACK");
CHECK_STATUS(status);
status = lefwEndSpacing();
CHECK_STATUS(status);
// MINFEATURE & DIELECTRIC
status = lefwMinFeature(0.1, 0.1);
CHECK_STATUS(status);
/* obsolete in 5.4
status = lefwDielectric(0.000345);
CHECK_STATUS(status);
*/
status = lefwNewLine();
CHECK_STATUS(status);
// IRDROP
/* obsolete in 5.4
status = lefwStartIrdrop();
CHECK_STATUS(status);
status = lefwIrdropTable("DRESHI", "0.0001 -0.7 0.001 -0.8 0.01 -0.9 0.1 -1.0");
CHECK_STATUS(status);
status = lefwIrdropTable("DRESLO", "0.0001 -1.7 0.001 -1.6 0.01 -1.5 0.1 -1.3");
CHECK_STATUS(status);
status = lefwIrdropTable("DNORESHI", "0.0001 -0.6 0.001 -0.7 0.01 -0.9 0.1 -1.1");
CHECK_STATUS(status);
status = lefwIrdropTable("DNORESLO", "0.0001 -1.5 0.001 -1.5 0.01 -1.4 0.1 -1.4");
CHECK_STATUS(status);
status = lefwEndIrdrop();
CHECK_STATUS(status);
*/
// SITE
status = lefwSite("CORE1", "CORE", "X", 67.2, 6);
CHECK_STATUS(status);
status = lefwSiteRowPattern("Fsite", 0);
CHECK_STATUS(status);
status = lefwSiteRowPatternStr("Lsite", "N");
CHECK_STATUS(status);
status = lefwSiteRowPatternStr("Lsite", "FS");
CHECK_STATUS(status);
lefwEndSite("CORE1");
CHECK_STATUS(status);
status = lefwSite("CORE", "CORE", "Y", 3.6, 28.8);
CHECK_STATUS(status);
lefwEndSite("CORE");
CHECK_STATUS(status);
status = lefwSite("MRCORE", "CORE", "Y", 3.6, 28.8);
CHECK_STATUS(status);
lefwEndSite("MRCORE");
CHECK_STATUS(status);
status = lefwSite("IOWIRED", "PAD", NULL, 57.6, 432);
CHECK_STATUS(status);
lefwEndSite("IOWIRED");
CHECK_STATUS(status);
// ARRAY
status = lefwStartArray("M7E4XXX");
CHECK_STATUS(status);
status = lefwArraySite("CORE", -5021.450, -4998.000, 0, 14346, 595, 0.700,
16.800);
CHECK_STATUS(status);
status = lefwArraySiteStr("CORE", -5021.450, -4998.600, "FS", 14346, 595,
0.700, 16.800);
CHECK_STATUS(status);
status = lefwArraySite("IO", 6148.800, 5800.000, 3, 1, 1, 0.000, 0.000);
CHECK_STATUS(status);
status = lefwArraySiteStr("IO", 6148.800, 5240.000, "E", 1, 1, 0.000, 0.000);
CHECK_STATUS(status);
status = lefwArraySite("COVER", -7315.0, -7315.000, 1, 1, 1, 0.000, 0.000);
CHECK_STATUS(status);
status = lefwArraySiteStr("COVER", 7315.0, 7315.000, "FN", 1, 1, 0.000, 0.000);
CHECK_STATUS(status);
status = lefwArrayCanplace("COVER", -7315.000, -7315.000, 0, 1, 1, 0.000,
0.000);
CHECK_STATUS(status);
status = lefwArrayCanplaceStr("COVER", -7250.000, -7250.000, "N", 5, 1,
40.000, 0.000);
CHECK_STATUS(status);
status = lefwArrayCannotoccupy("CORE", -5021.450, -4989.600, 6, 100, 595,
0.700, 16.800);
CHECK_STATUS(status);
status = lefwArrayCannotoccupyStr("CORE", -5021.450, -4989.600, "N", 100, 595,
0.700, 16.800);
CHECK_STATUS(status);
status = lefwArrayTracks("X", -6148.800, 17569, 0.700, "RX");
CHECK_STATUS(status);
status = lefwArrayTracks("Y", -6148.800, 20497, 0.600, "RX");
CHECK_STATUS(status);
status = lefwStartArrayFloorplan("100%");
CHECK_STATUS(status);
status = lefwArrayFloorplan("CANPLACE", "COVER", -7315.000, -7315.000, 1, 1,
1, 0.000, 0.000);
CHECK_STATUS(status);
status = lefwArrayFloorplanStr("CANPLACE", "COVER", -7250.000, -7250.000,
"N", 5, 1, 40.000, 0.000);
CHECK_STATUS(status);
status = lefwArrayFloorplan("CANPLACE", "CORE", -5021.000, -4998.000, 1,
14346, 595, 0.700, 16.800);
CHECK_STATUS(status);
status = lefwArrayFloorplanStr("CANPLACE", "CORE", -5021.000, -4998.000, "FS",
100, 595, 0.700, 16.800);
CHECK_STATUS(status);
status = lefwArrayFloorplan("CANNOTOCCUPY", "CORE", -5021.000, -4998.000, 7,
14346, 595, 0.700, 16.800);
CHECK_STATUS(status);
status = lefwArrayFloorplanStr("CANNOTOCCUPY", "CORE", -5021.000, -4998.000,
"E", 100, 595, 0.700, 16.800);
CHECK_STATUS(status);
status = lefwEndArrayFloorplan("100%");
CHECK_STATUS(status);
status = lefwArrayGcellgrid("X", -6157.200, 1467, 8.400);
CHECK_STATUS(status);
status = lefwArrayGcellgrid("Y", -6157.200, 1467, 8.400);
CHECK_STATUS(status);
status = lefwEndArray("M7E4XXX");
CHECK_STATUS(status);
// MACRO
status = lefwStartMacro("CHK3A");
CHECK_STATUS(status);
status = lefwMacroClass("RING", NULL);
CHECK_STATUS(status);
status = lefwMacroFixedMask();
CHECK_STATUS(status);
// status = lefwMacroSource("USER"); 5.6
// CHECK_STATUS(status);
status = lefwMacroOrigin(0.9, 0.9);
CHECK_STATUS(status);
status = lefwMacroSize(10.8, 28.8);
CHECK_STATUS(status);
status = lefwMacroSymmetry("X Y R90");
CHECK_STATUS(status);
status = lefwMacroSite("CORE");
CHECK_STATUS(status);
status = lefwStartMacroPin("GND");
CHECK_STATUS(status);
status = lefwMacroPinDirection("INOUT");
CHECK_STATUS(status);
status = lefwMacroPinMustjoin("PA3");
CHECK_STATUS(status);
status = lefwMacroPinTaperRule("RULE1");
CHECK_STATUS(status);
status = lefwMacroPinUse("GROUND");
CHECK_STATUS(status);
status = lefwMacroPinShape("ABUTMENT");
CHECK_STATUS(status);
// status = lefwMacroPinLEQ("A"); 5.6
// CHECK_STATUS(status);
status = lefwMacroPinSupplySensitivity("vddpin1");
CHECK_STATUS(status);
status = lefwMacroPinNetExpr("power1 VDD1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMetalArea(3, "M1");
CHECK_STATUS(status);
// MACRO - PIN
status = lefwStartMacroPinPort(NULL);
CHECK_STATUS(status);
// status = lefwMacroPinForeign("GROUND", 4, 7, 6); 5.6
// CHECK_STATUS(status);
// status = lefwMacroPinForeignStr("VSS", 4, 7, "W"); 5.6
// CHECK_STATUS(status);
status = lefwMacroPinPortLayer("M1", 0.05);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(-0.9, 3, 9.9, 6, 0, 0, 0, 0, 3);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
status = lefwStringProperty("TYPE", "special");
CHECK_STATUS(status);
status = lefwIntProperty("intProp", 23);
CHECK_STATUS(status);
status = lefwRealProperty("realProp", 24.25);
CHECK_STATUS(status);
/* WMD - Comment them out due to mix 5.3 & 5.4 syntax
status = lefwMacroPinAntennasize(1, "M1");
CHECK_STATUS(status);
status = lefwMacroPinAntennasize(2, "M2");
*/
status = lefwMacroPinAntennaModel("OXIDE1");
CHECK_STATUS(status);
status = lefwEndMacroPin("GND");
CHECK_STATUS(status);
status = lefwStartMacroPin("VDD");
CHECK_STATUS(status);
status = lefwMacroPinDirection("INOUT");
CHECK_STATUS(status);
status = lefwMacroPinUse("POWER");
CHECK_STATUS(status);
status = lefwMacroPinShape("ABUTMENT");
CHECK_STATUS(status);
status = lefwMacroPinNetExpr("power2 VDD2");
CHECK_STATUS(status);
// MACRO - PIN - PORT
status = lefwStartMacroPinPort(NULL);
CHECK_STATUS(status);
status = lefwMacroPinPortLayer("M1", 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(-0.9, 21, 9.9, 24, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroPinPortVia(100, 300, "nd1VIA12", 1, 2, 1, 2, 123);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
status = lefwStartMacroPinPort("BUMP");
CHECK_STATUS(status);
status = lefwMacroPinPortLayer("M2", 0.06);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
xl = (double*)malloc(sizeof(double)*5);
yl = (double*)malloc(sizeof(double)*5);
xl[0] = 30.8;
yl[0] = 30.5;
xl[1] = 42;
yl[1] = 53.5;
xl[2] = 60.8;
yl[2] = 25.5;
xl[3] = 47;
yl[3] = 15.5;
xl[4] = 20.8;
yl[4] = 0.5;
status = lefwStartMacroPinPort("CORE");
CHECK_STATUS(status);
status = lefwMacroPinPortLayer("P1", 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerPolygon(5, xl, yl, 5, 6, 454.6, 345.6, 2);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerPolygon(5, xl, yl, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
free((char*)xl);
free((char*)yl);
/* WMD - Comment them out due to mix 5.3 & 5.4 syntax
status = lefwMacroPinAntennaMetalArea(3, "M1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMetalArea(4, "M2");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMetalLength(5, "M1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMetalLength(6, "M2");
CHECK_STATUS(status);
*/
status = lefwEndMacroPin("VDD");
CHECK_STATUS(status);
status = lefwStartMacroPin("PA3");
CHECK_STATUS(status);
status = lefwMacroPinDirection("INPUT");
CHECK_STATUS(status);
status = lefwMacroPinNetExpr("gnd1 GND");
CHECK_STATUS(status);
// 5.4
status = lefwMacroPinAntennaPartialMetalArea(4, "M1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaPartialMetalArea(5, "M2");
CHECK_STATUS(status);
status = lefwMacroPinAntennaPartialMetalSideArea(5, "M2");
CHECK_STATUS(status);
status = lefwMacroPinAntennaGateArea(1, "M1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaGateArea(2, 0);
CHECK_STATUS(status);
status = lefwMacroPinAntennaGateArea(3, "M3");
CHECK_STATUS(status);
status = lefwMacroPinAntennaDiffArea(1, "M1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMaxAreaCar(1, "L1");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMaxSideAreaCar(1, 0);
CHECK_STATUS(status);
status = lefwMacroPinAntennaPartialCutArea(1, 0);
CHECK_STATUS(status);
status = lefwMacroPinAntennaPartialCutArea(2, "M2");
CHECK_STATUS(status);
status = lefwMacroPinAntennaPartialCutArea(3, 0);
CHECK_STATUS(status);
status = lefwMacroPinAntennaPartialCutArea(4, "M4");
CHECK_STATUS(status);
status = lefwMacroPinAntennaMaxCutCar(1, 0);
CHECK_STATUS(status);
status = lefwStartMacroPinPort("CORE");
CHECK_STATUS(status);
status = lefwMacroPinPortLayer("M1", 0.02);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(1.35, -0.45, 2.25, 0.45, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(-0.45, -0.45, 0.45, 0.45, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
status = lefwStartMacroPinPort(NULL);
CHECK_STATUS(status);
status = lefwMacroPinPortLayer("PC", 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(-0.45, 12.15, 0.45, 13.05, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
status = lefwStartMacroPinPort(NULL);
CHECK_STATUS(status);
status = lefwMacroPinPortDesignRuleWidth("PC", 2);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(8.55, 8.55, 9.45, 9.45, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(6.75, 6.75, 7.65, 7.65, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(6.75, 8.75, 7.65, 9.65, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerRect(6.75, 10.35, 7.65, 11.25, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
status = lefwEndMacroPin("PA3");
CHECK_STATUS(status);
// MACRO - OBS
status = lefwStartMacroObs();
CHECK_STATUS(status);
status = lefwMacroObsLayer("M1", 5.6);
CHECK_STATUS(status);
status = lefwMacroObsLayerWidth(5.4);
CHECK_STATUS(status);
status = lefwMacroObsLayerRect(6.6, -0.6, 9.6, 0.6, 0, 0, 0, 0, 2);
CHECK_STATUS(status);
status = lefwMacroObsLayerRect(4.8, 12.9, 9.6, 13.2, 0, 0, 0, 0, 3);
CHECK_STATUS(status);
status = lefwMacroObsLayerRect(3, 13.8, 7.8, 16.8, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroObsLayerRect(3, -0.6, 6, 0.6, 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndMacroObs();
CHECK_STATUS(status);
status = lefwStringProperty("stringProp", "first");
CHECK_STATUS(status);
status = lefwIntProperty("integerProp", 1);
CHECK_STATUS(status);
status = lefwRealProperty("WEIGHT", 30.31);
CHECK_STATUS(status);
status = lefwEndMacro("CHK3A");
CHECK_STATUS(status);
// 2nd MACRO
status = lefwStartMacro("INV");
CHECK_STATUS(status);
status = lefwMacroEEQ("CHK1");
CHECK_STATUS(status);
// status = lefwMacroLEQ("CHK2"); 5.6
// CHECK_STATUS(status);
status = lefwMacroClass("CORE", "SPACER");
CHECK_STATUS(status);
status = lefwMacroForeign("INVS", 0, 0, -1);
CHECK_STATUS(status);
/* obsolete in 5.4
status = lefwMacroPower(1.0);
CHECK_STATUS(status);
*/
status = lefwMacroSize(67.2, 24);
CHECK_STATUS(status);
status = lefwMacroSymmetry("X Y R90");
CHECK_STATUS(status);
status = lefwMacroSite("CORE1");
CHECK_STATUS(status);
status = lefwStartMacroDensity("metal1");
CHECK_STATUS(status);
status = lefwMacroDensityLayerRect(0, 0, 100, 100, 45.5);
CHECK_STATUS(status);
status = lefwMacroDensityLayerRect(100, 0, 200, 100, 42.2);
CHECK_STATUS(status);
status = lefwEndMacroDensity();
CHECK_STATUS(status);
status = lefwStartMacroDensity("metal2");
CHECK_STATUS(status);
status = lefwMacroDensityLayerRect(200, 1, 300, 200, 43.3);
CHECK_STATUS(status);
status = lefwEndMacroDensity();
CHECK_STATUS(status);
status = lefwStartMacroPin("Z");
CHECK_STATUS(status);
status = lefwMacroPinDirection("OUTPUT");
CHECK_STATUS(status);
status = lefwMacroPinUse("SIGNAL");
CHECK_STATUS(status);
status = lefwMacroPinShape("ABUTMENT");
CHECK_STATUS(status);
/* obsolete in 5.4
status = lefwMacroPinRisethresh(22);
CHECK_STATUS(status);
status = lefwMacroPinFallthresh(100);
CHECK_STATUS(status);
status = lefwMacroPinRisesatcur(4);
CHECK_STATUS(status);
status = lefwMacroPinFallsatcur(.5);
CHECK_STATUS(status);
status = lefwMacroPinVLO(0);
CHECK_STATUS(status);
status = lefwMacroPinVHI(5);
CHECK_STATUS(status);
status = lefwMacroPinCapacitance(0.08);
CHECK_STATUS(status);
status = lefwMacroPinPower(0.1);
CHECK_STATUS(status);
*/
status = lefwMacroPinAntennaModel("OXIDE1");
CHECK_STATUS(status);
status = lefwStartMacroPinPort(NULL);
CHECK_STATUS(status);
status = lefwMacroPinPortLayer("M2", 0);
CHECK_STATUS(status);
status = lefwMacroPinPortLayerWidth(5.6);
CHECK_STATUS(status);
xpath = (double*)malloc(sizeof(double)*7);
ypath = (double*)malloc(sizeof(double)*7);
xpath[0] = 30.8;
ypath[0] = 9;
xpath[1] = 42;
ypath[1] = 9;
xpath[2] = 30.8;
ypath[2] = 9;
xpath[3] = 42;
ypath[3] = 9;
xpath[4] = 30.8;
ypath[4] = 9;
xpath[5] = 42;
ypath[5] = 9;
xpath[6] = 30.8;
ypath[6] = 9;
status = lefwMacroPinPortLayerPath(7, xpath, ypath, 0, 0, 0, 0, 2);
CHECK_STATUS(status);
status = lefwEndMacroPinPort();
CHECK_STATUS(status);
status = lefwEndMacroPin("Z");
free((char*)xpath);
free((char*)ypath);
// MACRO - TIMING
/* obsolete in 5.4
status = lefwStartMacroTiming();
CHECK_STATUS(status);
status = lefwMacroTimingPin("A", "Z");
CHECK_STATUS(status);
status = lefwMacroTimingIntrinsic("RISE", .39, .41, 1.2, .25, .29, 1.8,
.67, .87, 2.2, 0.12, 0.13);
CHECK_STATUS(status);
status = lefwMacroTimingIntrinsic("FALL", .25, .29, 1.3, .26, .31, 1.7,
.6, .8, 2.1, 0.11, 0.14);
CHECK_STATUS(status);
status = lefwMacroTimingRisers(83.178, 90.109);
CHECK_STATUS(status);
status = lefwMacroTimingFallrs(76.246, 97.041);
CHECK_STATUS(status);
status = lefwMacroTimingRisecs(0.751, 0.751);
CHECK_STATUS(status);
status = lefwMacroTimingFallcs(0.751, 0.751);
CHECK_STATUS(status);
status = lefwMacroTimingRiset0(0.65453, 0.65453);
CHECK_STATUS(status);
status = lefwMacroTimingFallt0(0.38, 0.38);
CHECK_STATUS(status);
status = lefwMacroTimingRisesatt1(0, 0);
CHECK_STATUS(status);
status = lefwMacroTimingFallsatt1(0.15, 0.15);
CHECK_STATUS(status);
status = lefwMacroTimingUnateness("INVERT");
CHECK_STATUS(status);
status = lefwEndMacroTiming();
CHECK_STATUS(status);
*/
// MACRO - OBS
status = lefwStartMacroObs();
CHECK_STATUS(status);
status = lefwMacroObsDesignRuleWidth("M1", 2);
CHECK_STATUS(status);
status = lefwMacroObsLayerRect(24.1, 1.5, 43.5, 208.5, 0, 0, 0, 0);
CHECK_STATUS(status);
xpath = (double*)malloc(sizeof(double)*2);
ypath = (double*)malloc(sizeof(double)*2);
xpath[0] = 8.4;
ypath[0] = 3;
xpath[1] = 8.4;
ypath[1] = 124;
status = lefwMacroObsLayerPath(2, xpath, ypath, 0, 0, 0, 0, 2);
CHECK_STATUS(status);
xpath[0] = 58.8;
ypath[0] = 3;
xpath[1] = 58.8;
ypath[1] = 123;
status = lefwMacroObsLayerPath(2, xpath, ypath, 0, 0, 0, 0, 3);
CHECK_STATUS(status);
xpath[0] = 64.4;
ypath[0] = 3;
xpath[1] = 64.4;
ypath[1] = 123;
status = lefwMacroObsLayerPath(2, xpath, ypath, 0, 0, 0, 0);
CHECK_STATUS(status);
free((char*)xpath);
free((char*)ypath);
xl = (double*)malloc(sizeof(double)*5);
yl = (double*)malloc(sizeof(double)*5);
xl[0] = 6.4;
xl[1] = 3.4;
xl[2] = 5.4;
xl[3] = 8.4;
xl[4] = 9.4;
yl[0] = 9.2;
yl[1] = 0.2;
yl[2] = 7.2;
yl[3] = 8.2;
yl[4] = 1.2;
status = lefwMacroObsLayerPolygon(5, xl, yl, 0, 0, 0, 0, 3);
CHECK_STATUS(status);
free((char*)xl);
free((char*)yl);
status = lefwEndMacroObs();
CHECK_STATUS(status);
status = lefwEndMacro("INV");
CHECK_STATUS(status);
// 3rd MACRO
status = lefwStartMacro("DFF3");
CHECK_STATUS(status);
status = lefwMacroClass("CORE", "ANTENNACELL");
CHECK_STATUS(status);
status = lefwMacroForeignStr("DFF3S", 0, 0, "N");
CHECK_STATUS(status);
/* obsolete in 5.4
status = lefwMacroPower(4.0);
CHECK_STATUS(status);
*/
status = lefwMacroSize(67.2, 210);
CHECK_STATUS(status);
status = lefwMacroSymmetry("X Y R90");
CHECK_STATUS(status);
status = lefwMacroSitePattern("CORE", 34, 54, 7, 30, 3, 1, 1);
CHECK_STATUS(status);
status = lefwMacroSitePatternStr("CORE1", 21, 68, "S", 30, 3, 2, 2);
CHECK_STATUS(status);
status = lefwEndMacro("DFF3");
CHECK_STATUS(status);
status = lefwStartMacro("DFF4");
CHECK_STATUS(status);
status = lefwMacroClass("COVER", "BUMP");
CHECK_STATUS(status);
status = lefwMacroForeignStr("DFF3S", 0, 0, "");
CHECK_STATUS(status);
status = lefwEndMacro("DFF4");
CHECK_STATUS(status);
status = lefwStartMacro("DFF5");
CHECK_STATUS(status);
status = lefwMacroClass("COVER", NULL);
CHECK_STATUS(status);
status = lefwMacroForeignStr("DFF3S", 0, 0, "");
CHECK_STATUS(status);
status = lefwEndMacro("DFF5");
CHECK_STATUS(status);
status = lefwStartMacro("DFF6");
CHECK_STATUS(status);
status = lefwMacroClass("BLOCK", "BLACKBOX");
CHECK_STATUS(status);
status = lefwMacroForeignStr("DFF3S", 0, 0, "");
CHECK_STATUS(status);
status = lefwEndMacro("DFF6");
CHECK_STATUS(status);
status = lefwStartMacro("DFF7");
CHECK_STATUS(status);
status = lefwMacroClass("PAD", "AREAIO");
CHECK_STATUS(status);
status = lefwMacroForeignStr("DFF3S", 0, 0, "");
CHECK_STATUS(status);
status = lefwEndMacro("DFF7");
CHECK_STATUS(status);
status = lefwStartMacro("DFF8");
CHECK_STATUS(status);
status = lefwMacroClass("BLOCK", "SOFT");
CHECK_STATUS(status);
status = lefwEndMacro("DFF8");
CHECK_STATUS(status);
status = lefwStartMacro("DFF9");
CHECK_STATUS(status);
status = lefwMacroClass("CORE", "WELLTAP");
CHECK_STATUS(status);
status = lefwEndMacro("DFF9");
CHECK_STATUS(status);
status = lefwStartMacro("myTest");
CHECK_STATUS(status);
status = lefwMacroClass("CORE", NULL);
CHECK_STATUS(status);
status = lefwMacroSize(10.0, 14.0);
CHECK_STATUS(status);
status = lefwMacroSymmetry("X");
CHECK_STATUS(status);
status = lefwMacroSitePatternStr("Fsite", 0, 0, "N", 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwMacroSitePatternStr("Fsite", 0, 7.0, "FS", 30, 3, 2, 2);
CHECK_STATUS(status);
status = lefwMacroSitePatternStr("Fsite", 4.0, 0, "N", 0, 0, 0, 0);
CHECK_STATUS(status);
status = lefwEndMacro("myTest");
CHECK_STATUS(status);
// ANTENNA, this will generate error for 5.4 since I already have ANTENNA
// somewhere
status = lefwAntenna("INPUTPINANTENNASIZE", 1);
CHECK_STATUS(status);
status = lefwAntenna("OUTPUTPINANTENNASIZE", -1);
CHECK_STATUS(status);
status = lefwAntenna("INOUTPINANTENNASIZE", -1);
CHECK_STATUS(status);
status = lefwNewLine();
CHECK_STATUS(status);
// BEGINEXT
status = lefwStartBeginext("SIGNATURE");
CHECK_STATUS(status);
lefwAddIndent();
status = lefwBeginextCreator("CADENCE");
CHECK_STATUS(status);
// since the date is different each run,
// comment it out, so the quick test will not fail
// status = lefwBeginextDate();
// CHECK_STATUS(status);
status = lefwEndBeginext();
CHECK_STATUS(status);
status = lefwEnd();
CHECK_STATUS(status);
lineNum = lefwCurrentLineNumber();
if (lineNum == 0)
fprintf(stderr, "ERROR: Nothing has been written!!!\n");
fclose(fout);
return 0;
}