| // ***************************************************************************** |
| // ***************************************************************************** |
| // 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> |
| #include <time.h> |
| #ifndef WIN32 |
| # include <unistd.h> |
| #endif /* not WIN32 */ |
| #include "defrReader.hpp" |
| #include "defiAlias.hpp" |
| |
| char defaultName[64]; |
| char defaultOut[64]; |
| |
| // Global variables |
| FILE* fout; |
| void* userData; |
| int numObjs; |
| int isSumSet; // to keep track if within SUM |
| int isProp = 0; // for PROPERTYDEFINITIONS |
| int begOperand; // to keep track for constraint, to print - as the 1st char |
| static double curVer = 0; |
| static int setSNetWireCbk = 0; |
| static int isSessionless = 0; |
| static int ignoreRowNames = 0; |
| static int ignoreViaNames = 0; |
| static int testDebugPrint = 0; // test for ccr1488696 |
| |
| // TX_DIR:TRANSLATION ON |
| |
| void myLogFunction(const char* errMsg){ |
| fprintf(fout, "ERROR: found error: %s\n", errMsg); |
| } |
| |
| void myWarningLogFunction(const char* errMsg){ |
| fprintf(fout, "WARNING: found error: %s\n", errMsg); |
| } |
| |
| void dataError() { |
| fprintf(fout, "ERROR: returned user data is not correct!\n"); |
| } |
| |
| void checkType(defrCallbackType_e c) { |
| if (c >= 0 && c <= defrDesignEndCbkType) { |
| // OK |
| } else { |
| fprintf(fout, "ERROR: callback type is out of bounds!\n"); |
| } |
| } |
| |
| |
| int done(defrCallbackType_e c, void*, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "END DESIGN\n"); |
| return 0; |
| } |
| |
| int endfunc(defrCallbackType_e c, void*, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| return 0; |
| } |
| |
| |
| char* orientStr(int orient) { |
| switch (orient) { |
| case 0: return ((char*)"N"); |
| case 1: return ((char*)"W"); |
| case 2: return ((char*)"S"); |
| case 3: return ((char*)"E"); |
| case 4: return ((char*)"FN"); |
| case 5: return ((char*)"FW"); |
| case 6: return ((char*)"FS"); |
| case 7: return ((char*)"FE"); |
| }; |
| return ((char*)"BOGUS"); |
| } |
| |
| int compMSL(defrCallbackType_e c, defiComponentMaskShiftLayer* co, defiUserData ud) { |
| int i; |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| |
| if (co->numMaskShiftLayers()) { |
| fprintf(fout, "\nCOMPONENTMASKSHIFT "); |
| |
| for (i = 0; i < co->numMaskShiftLayers(); i++) { |
| fprintf(fout, "%s ", co->maskShiftLayer(i)); |
| } |
| fprintf(fout, ";\n"); |
| } |
| |
| return 0; |
| } |
| |
| int compf(defrCallbackType_e c, defiComponent* co, defiUserData ud) { |
| if (testDebugPrint) { |
| co->print(fout); |
| } else { |
| int i; |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| // missing GENERATE, FOREIGN |
| fprintf(fout, "- %s %s ", co->id(), |
| co->name()); |
| // co->changeIdAndName("idName", "modelName"); |
| // fprintf(fout, "%s %s ", co->id(), |
| // co->name()); |
| if (co->hasNets()) { |
| for (i = 0; i < co->numNets(); i++) |
| fprintf(fout, "%s ", co->net(i)); |
| } |
| if (co->isFixed()) |
| fprintf(fout, "+ FIXED %d %d %s ", |
| co->placementX(), |
| co->placementY(), |
| //orientStr(co->placementOrient())); |
| co->placementOrientStr()); |
| if (co->isCover()) |
| fprintf(fout, "+ COVER %d %d %s ", |
| co->placementX(), |
| co->placementY(), |
| orientStr(co->placementOrient())); |
| if (co->isPlaced()) |
| fprintf(fout,"+ PLACED %d %d %s ", |
| co->placementX(), |
| co->placementY(), |
| orientStr(co->placementOrient())); |
| if (co->isUnplaced()) { |
| fprintf(fout,"+ UNPLACED "); |
| if ((co->placementX() != -1) || |
| (co->placementY() != -1)) |
| fprintf(fout,"%d %d %s ", |
| co->placementX(), |
| co->placementY(), |
| orientStr(co->placementOrient())); |
| } |
| if (co->hasSource()) |
| fprintf(fout, "+ SOURCE %s ", co->source()); |
| if (co->hasGenerate()) { |
| fprintf(fout, "+ GENERATE %s ", co->generateName()); |
| if (co->macroName() && |
| *(co->macroName())) |
| fprintf(fout, "%s ", co->macroName()); |
| } |
| if (co->hasWeight()) |
| fprintf(fout, "+ WEIGHT %d ", co->weight()); |
| if (co->hasEEQ()) |
| fprintf(fout, "+ EEQMASTER %s ", co->EEQ()); |
| if (co->hasRegionName()) |
| fprintf(fout, "+ REGION %s ", co->regionName()); |
| if (co->hasRegionBounds()) { |
| int *xl, *yl, *xh, *yh; |
| int size; |
| co->regionBounds(&size, &xl, &yl, &xh, &yh); |
| for (i = 0; i < size; i++) { |
| fprintf(fout, "+ REGION %d %d %d %d \n", |
| xl[i], yl[i], xh[i], yh[i]); |
| } |
| } |
| if (co->maskShiftSize()) { |
| fprintf(fout, "+ MASKSHIFT "); |
| |
| for (int i = co->maskShiftSize()-1; i >= 0; i--) { |
| fprintf(fout, "%d", co->maskShift(i)); |
| } |
| fprintf(fout, "\n"); |
| } |
| if (co->hasHalo()) { |
| int left, bottom, right, top; |
| (void) co->haloEdges(&left, &bottom, &right, &top); |
| fprintf(fout, "+ HALO "); |
| if (co->hasHaloSoft()) |
| fprintf(fout, "SOFT "); |
| fprintf(fout, "%d %d %d %d\n", left, bottom, right, top); |
| } |
| if (co->hasRouteHalo()) { |
| fprintf(fout, "+ ROUTEHALO %d %s %s\n", co->haloDist(), |
| co->minLayer(), co->maxLayer()); |
| } |
| if (co->hasForeignName()) { |
| fprintf(fout, "+ FOREIGN %s %d %d %s %d ", |
| co->foreignName(), co->foreignX(), |
| co->foreignY(), co->foreignOri(), |
| co->foreignOrient()); |
| } |
| if (co->numProps()) { |
| for (i = 0; i < co->numProps(); i++) { |
| fprintf(fout, "+ PROPERTY %s %s ", co->propName(i), |
| co->propValue(i)); |
| switch (co->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| } |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END COMPONENTS\n"); |
| } |
| |
| return 0; |
| } |
| |
| |
| int netpath(defrCallbackType_e, defiNet*, defiUserData) { |
| fprintf(fout, "\n"); |
| |
| fprintf (fout, "Callback of partial path for net\n"); |
| |
| return 0; |
| } |
| |
| |
| int netNamef(defrCallbackType_e c, const char* netName, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "- %s ", netName); |
| return 0; |
| } |
| |
| int subnetNamef(defrCallbackType_e c, const char* subnetName, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (curVer >= 5.6) |
| fprintf(fout, " + SUBNET CBK %s ", subnetName); |
| return 0; |
| } |
| |
| int nondefRulef(defrCallbackType_e c, const char* ruleName, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (curVer >= 5.6) |
| fprintf(fout, " + NONDEFAULTRULE CBK %s ", ruleName); |
| return 0; |
| } |
| |
| int netf(defrCallbackType_e c, defiNet* net, defiUserData ud) { |
| // For net and special net. |
| int i, j, k, w, x, y, z, count, newLayer; |
| defiPath* p; |
| defiSubnet *s; |
| int path; |
| defiVpin *vpin; |
| // defiShield *noShield; |
| defiWire *wire; |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (c != defrNetCbkType) |
| fprintf(fout, "BOGUS NET TYPE "); |
| if (net->pinIsMustJoin(0)) |
| fprintf(fout, "- MUSTJOIN "); |
| // 5/6/2004 - don't need since I have a callback for the name |
| // else |
| // fprintf(fout, "- %s ", net->name()); |
| |
| // net->changeNetName("newNetName"); |
| // fprintf(fout, "%s ", net->name()); |
| count = 0; |
| // compName & pinName |
| for (i = 0; i < net->numConnections(); i++) { |
| // set the limit of only 5 items per line |
| count++; |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| fprintf(fout, "( %s %s ) ", net->instance(i), |
| net->pin(i)); |
| // net->changeInstance("newInstance", i); |
| // net->changePin("newPin", i); |
| // fprintf(fout, "( %s %s ) ", net->instance(i), |
| // net->pin(i)); |
| if (net->pinIsSynthesized(i)) |
| fprintf(fout, "+ SYNTHESIZED "); |
| } |
| |
| if (net->hasNonDefaultRule()) |
| fprintf(fout, "+ NONDEFAULTRULE %s\n", net->nonDefaultRule()); |
| |
| for (i = 0; i < net->numVpins(); i++) { |
| vpin = net->vpin(i); |
| fprintf(fout, " + %s", vpin->name()); |
| if (vpin->layer()) |
| fprintf(fout, " %s", vpin->layer()); |
| fprintf(fout, " %d %d %d %d", vpin->xl(), vpin->yl(), vpin->xh(), |
| vpin->yh()); |
| if (vpin->status() != ' ') { |
| fprintf(fout, " %c", vpin->status()); |
| fprintf(fout, " %d %d", vpin->xLoc(), vpin->yLoc()); |
| if (vpin->orient() != -1) |
| fprintf(fout, " %s", orientStr(vpin->orient())); |
| } |
| fprintf(fout, "\n"); |
| } |
| |
| // regularWiring |
| if (net->numWires()) { |
| for (i = 0; i < net->numWires(); i++) { |
| newLayer = 0; |
| wire = net->wire(i); |
| fprintf(fout, "\n + %s ", wire->wireType()); |
| count = 0; |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_RECT: |
| p->getViaRect(&w, &x, &y, &z); |
| fprintf(fout, "RECT ( %d %d %d %d ) ", w, x, y, z); |
| break; |
| case DEFIPATH_VIRTUALPOINT: |
| p->getVirtualPoint(&x, &y); |
| fprintf(fout, "VIRTUAL ( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_TAPERRULE: |
| fprintf(fout, "TAPERRULE %s ",p->getTaperRule()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "STYLE %d ",p->getStyle()); |
| break; |
| } |
| } |
| } |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| } |
| |
| // SHIELDNET |
| if (net->numShieldNets()) { |
| for (i = 0; i < net->numShieldNets(); i++) |
| fprintf(fout, "\n + SHIELDNET %s", net->shieldNet(i)); |
| } |
| /* obsolete in 5.4 |
| if (net->numNoShields()) { |
| for (i = 0; i < net->numNoShields(); i++) { |
| noShield = net->noShield(i); |
| fprintf(fout, "\n + NOSHIELD "); |
| newLayer = 0; |
| for (j = 0; j < noShield->numPaths(); j++) { |
| p = noShield->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_TAPERRULE: |
| fprintf(fout, "TAPERRULE %s ", |
| p->getTaperRule()); |
| break; |
| } |
| } |
| } |
| } |
| } |
| */ |
| |
| if (net->hasSubnets()) { |
| for (i = 0; i < net->numSubnets(); i++) { |
| s = net->subnet(i); |
| fprintf(fout, "\n"); |
| |
| if (s->numConnections()) { |
| if (s->pinIsMustJoin(0)) |
| fprintf(fout, "- MUSTJOIN "); |
| else |
| fprintf(fout, " + SUBNET %s ", s->name()); |
| for (j = 0; j < s->numConnections(); j++) |
| fprintf(fout, " ( %s %s )\n", s->instance(j), |
| s->pin(j)); |
| |
| // regularWiring |
| if (s->numWires()) { |
| for (k = 0; k < s->numWires(); k++) { |
| newLayer = 0; |
| wire = s->wire(k); |
| fprintf(fout, " %s ", wire->wireType()); |
| count = 0; |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", |
| p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| p->getViaRotationStr()); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_TAPERRULE: |
| fprintf(fout, "TAPERRULE %s ", |
| p->getTaperRule()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "STYLE %d ", |
| p->getStyle()); |
| break; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| if (net->numProps()) { |
| for (i = 0; i < net->numProps(); i++) { |
| fprintf(fout, " + PROPERTY %s ", net->propName(i)); |
| switch (net->propType(i)) { |
| case 'R': fprintf(fout, "%g REAL ", net->propNumber(i)); |
| break; |
| case 'I': fprintf(fout, "%g INTEGER ", net->propNumber(i)); |
| break; |
| case 'S': fprintf(fout, "%s STRING ", net->propValue(i)); |
| break; |
| case 'Q': fprintf(fout, "%s QUOTESTRING ", net->propValue(i)); |
| break; |
| case 'N': fprintf(fout, "%g NUMBER ", net->propNumber(i)); |
| break; |
| } |
| fprintf(fout, "\n"); |
| } |
| } |
| |
| if (net->hasWeight()) |
| fprintf(fout, "+ WEIGHT %d ", net->weight()); |
| if (net->hasCap()) |
| fprintf(fout, "+ ESTCAP %g ", net->cap()); |
| if (net->hasSource()) |
| fprintf(fout, "+ SOURCE %s ", net->source()); |
| if (net->hasFixedbump()) |
| fprintf(fout, "+ FIXEDBUMP "); |
| if (net->hasFrequency()) |
| fprintf(fout, "+ FREQUENCY %g ", net->frequency()); |
| if (net->hasPattern()) |
| fprintf(fout, "+ PATTERN %s ", net->pattern()); |
| if (net->hasOriginal()) |
| fprintf(fout, "+ ORIGINAL %s ", net->original()); |
| if (net->hasUse()) |
| fprintf(fout, "+ USE %s ", net->use()); |
| |
| fprintf (fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END NETS\n"); |
| return 0; |
| } |
| |
| |
| int snetpath(defrCallbackType_e c, defiNet* ppath, defiUserData ud) { |
| int i, j, x, y, z, count, newLayer; |
| char* layerName; |
| double dist, left, right; |
| defiPath* p; |
| defiSubnet *s; |
| int path; |
| defiShield* shield; |
| defiWire* wire; |
| int numX, numY, stepX, stepY; |
| |
| if (c != defrSNetPartialPathCbkType) |
| return 1; |
| if (ud != userData) dataError(); |
| |
| fprintf (fout, "SPECIALNET partial data\n"); |
| |
| fprintf(fout, "- %s ", ppath->name()); |
| |
| count = 0; |
| // compName & pinName |
| for (i = 0; i < ppath->numConnections(); i++) { |
| // set the limit of only 5 items print out in one line |
| count++; |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| fprintf (fout, "( %s %s ) ", ppath->instance(i), |
| ppath->pin(i)); |
| if (ppath->pinIsSynthesized(i)) |
| fprintf(fout, "+ SYNTHESIZED "); |
| } |
| |
| // specialWiring |
| // POLYGON |
| if (ppath->numPolygons()) { |
| struct defiPoints points; |
| for (i = 0; i < ppath->numPolygons(); i++) { |
| fprintf(fout, "\n + POLYGON %s ", ppath->polygonName(i)); |
| points = ppath->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| } |
| } |
| // RECT |
| if (ppath->numRectangles()) { |
| for (i = 0; i < ppath->numRectangles(); i++) { |
| fprintf(fout, "\n + RECT %s %d %d %d %d", ppath->rectName(i), |
| ppath->xl(i), ppath->yl(i), |
| ppath->xh(i), ppath->yh(i)); |
| } |
| } |
| |
| // COVER, FIXED, ROUTED or SHIELD |
| if (ppath->numWires()) { |
| newLayer = 0; |
| for (i = 0; i < ppath->numWires(); i++) { |
| newLayer = 0; |
| wire = ppath->wire(i); |
| fprintf(fout, "\n + %s ", wire->wireType()); |
| if (strcmp (wire->wireType(), "SHIELD") == 0) |
| fprintf(fout, "%s ", wire->wireShieldNetName()); |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_VIADATA: |
| p->getViaData(&numX, &numY, &stepX, &stepY); |
| fprintf(fout, "DO %d BY %d STEP %d %d ", numX, numY, |
| stepX, stepY); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_SHAPE: |
| fprintf(fout, "+ SHAPE %s ", p->getShape()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "+ STYLE %d ", p->getStyle()); |
| break; |
| } |
| } |
| } |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| } |
| |
| if (ppath->hasSubnets()) { |
| for (i = 0; i < ppath->numSubnets(); i++) { |
| s = ppath->subnet(i); |
| if (s->numConnections()) { |
| if (s->pinIsMustJoin(0)) |
| fprintf(fout, "- MUSTJOIN "); |
| else |
| fprintf(fout, "- %s ", s->name()); |
| for (j = 0; j < s->numConnections(); j++) { |
| fprintf(fout, " ( %s %s )\n", s->instance(j), |
| s->pin(j)); |
| } |
| } |
| |
| // regularWiring |
| if (s->numWires()) { |
| for (i = 0; i < s->numWires(); i++) { |
| wire = s->wire(i); |
| fprintf(fout, " + %s ", wire->wireType()); |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->print(fout); |
| } |
| } |
| } |
| } |
| } |
| |
| if (ppath->numProps()) { |
| for (i = 0; i < ppath->numProps(); i++) { |
| if (ppath->propIsString(i)) |
| fprintf(fout, " + PROPERTY %s %s ", ppath->propName(i), |
| ppath->propValue(i)); |
| if (ppath->propIsNumber(i)) |
| fprintf(fout, " + PROPERTY %s %g ", ppath->propName(i), |
| ppath->propNumber(i)); |
| switch (ppath->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| fprintf(fout, "\n"); |
| } |
| } |
| |
| // SHIELD |
| count = 0; |
| // testing the SHIELD for 5.3, obsolete in 5.4 |
| if (ppath->numShields()) { |
| for (i = 0; i < ppath->numShields(); i++) { |
| shield = ppath->shield(i); |
| fprintf(fout, "\n + SHIELD %s ", shield->shieldName()); |
| newLayer = 0; |
| for (j = 0; j < shield->numPaths(); j++) { |
| p = shield->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| if (newLayer) |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| else |
| fprintf(fout, "Str %s ", |
| p->getViaRotationStr()); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_SHAPE: |
| fprintf(fout, "+ SHAPE %s ", p->getShape()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "+ STYLE %d ", p->getStyle()); |
| } |
| } |
| } |
| } |
| } |
| |
| // layerName width |
| if (ppath->hasWidthRules()) { |
| for (i = 0; i < ppath->numWidthRules(); i++) { |
| ppath->widthRule(i, &layerName, &dist); |
| fprintf (fout, "\n + WIDTH %s %g ", layerName, dist); |
| } |
| } |
| |
| // layerName spacing |
| if (ppath->hasSpacingRules()) { |
| for (i = 0; i < ppath->numSpacingRules(); i++) { |
| ppath->spacingRule(i, &layerName, &dist, &left, &right); |
| if (left == right) |
| fprintf (fout, "\n + SPACING %s %g ", layerName, dist); |
| else |
| fprintf (fout, "\n + SPACING %s %g RANGE %g %g ", |
| layerName, dist, left, right); |
| } |
| } |
| |
| if (ppath->hasFixedbump()) |
| fprintf(fout, "\n + FIXEDBUMP "); |
| if (ppath->hasFrequency()) |
| fprintf(fout, "\n + FREQUENCY %g ", ppath->frequency()); |
| if (ppath->hasVoltage()) |
| fprintf(fout, "\n + VOLTAGE %g ", ppath->voltage()); |
| if (ppath->hasWeight()) |
| fprintf(fout, "\n + WEIGHT %d ", ppath->weight()); |
| if (ppath->hasCap()) |
| fprintf(fout, "\n + ESTCAP %g ", ppath->cap()); |
| if (ppath->hasSource()) |
| fprintf(fout, "\n + SOURCE %s ", ppath->source()); |
| if (ppath->hasPattern()) |
| fprintf(fout, "\n + PATTERN %s ", ppath->pattern()); |
| if (ppath->hasOriginal()) |
| fprintf(fout, "\n + ORIGINAL %s ", ppath->original()); |
| if (ppath->hasUse()) |
| fprintf(fout, "\n + USE %s ", ppath->use()); |
| |
| fprintf(fout, "\n"); |
| |
| return 0; |
| } |
| |
| |
| int snetwire(defrCallbackType_e c, defiNet* ppath, defiUserData ud) { |
| int i, j, x, y, z, count = 0, newLayer; |
| defiPath* p; |
| int path; |
| defiWire* wire; |
| defiShield* shield; |
| int numX, numY, stepX, stepY; |
| |
| if (c != defrSNetWireCbkType) |
| return 1; |
| if (ud != userData) dataError(); |
| |
| fprintf (fout, "SPECIALNET wire data\n"); |
| |
| fprintf(fout, "- %s ", ppath->name()); |
| |
| // POLYGON |
| if (ppath->numPolygons()) { |
| struct defiPoints points; |
| for (i = 0; i < ppath->numPolygons(); i++) { |
| fprintf(fout, "\n + POLYGON %s ", ppath->polygonName(i)); |
| |
| points = ppath->getPolygon(i); |
| |
| for (j = 0; j < points.numPoints; j++) { |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| } |
| } |
| // RECT |
| } |
| if (ppath->numRectangles()) { |
| for (i = 0; i < ppath->numRectangles(); i++) { |
| fprintf(fout, "\n + RECT %s %d %d %d %d", ppath->rectName(i), |
| ppath->xl(i), ppath->yl(i), |
| ppath->xh(i), ppath->yh(i)); |
| } |
| } |
| // VIA |
| if (ppath->numViaSpecs()) { |
| for (i = 0; i < ppath->numViaSpecs(); i++) { |
| fprintf(fout, "\n + VIA %s ", ppath->viaName(i)), |
| fprintf(fout, " %s", ppath->viaOrientStr(i)); |
| |
| defiPoints points = ppath->getViaPts(i); |
| |
| for (int j = 0; j < points.numPoints; j++) { |
| fprintf(fout, " %d %d", points.x[j], points.y[j]); |
| } |
| } |
| } |
| |
| // specialWiring |
| if (ppath->numWires()) { |
| newLayer = 0; |
| for (i = 0; i < ppath->numWires(); i++) { |
| newLayer = 0; |
| wire = ppath->wire(i); |
| fprintf(fout, "\n + %s ", wire->wireType()); |
| if (strcmp (wire->wireType(), "SHIELD") == 0) |
| fprintf(fout, "%s ", wire->wireShieldNetName()); |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_VIADATA: |
| p->getViaData(&numX, &numY, &stepX, &stepY); |
| fprintf(fout, "DO %d BY %d STEP %d %d ", numX, numY, |
| stepX, stepY); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_SHAPE: |
| fprintf(fout, "+ SHAPE %s ", p->getShape()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "+ STYLE %d ", p->getStyle()); |
| break; |
| } |
| } |
| } |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| } else if (ppath->numShields()) { |
| for (i = 0; i < ppath->numShields(); i++) { |
| shield = ppath->shield(i); |
| fprintf(fout, "\n + SHIELD %s ", shield->shieldName()); |
| newLayer = 0; |
| for (j = 0; j < shield->numPaths(); j++) { |
| p = shield->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_SHAPE: |
| fprintf(fout, "+ SHAPE %s ", p->getShape()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "+ STYLE %d ", p->getStyle()); |
| break; |
| } |
| } |
| } |
| } |
| } |
| |
| fprintf(fout, "\n"); |
| |
| return 0; |
| } |
| |
| int snetf(defrCallbackType_e c, defiNet* net, defiUserData ud) { |
| // For net and special net. |
| int i, j, x, y, z, count, newLayer; |
| char* layerName; |
| double dist, left, right; |
| defiPath* p; |
| defiSubnet *s; |
| int path; |
| defiShield* shield; |
| defiWire* wire; |
| int numX, numY, stepX, stepY; |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (c != defrSNetCbkType) |
| fprintf(fout, "BOGUS NET TYPE "); |
| |
| // 5/6/2004 - don't need since I have a callback for the name |
| // fprintf(fout, "- %s ", net->name()); |
| |
| count = 0; |
| // compName & pinName |
| for (i = 0; i < net->numConnections(); i++) { |
| // set the limit of only 5 items print out in one line |
| count++; |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| fprintf (fout, "( %s %s ) ", net->instance(i), |
| net->pin(i)); |
| if (net->pinIsSynthesized(i)) |
| fprintf(fout, "+ SYNTHESIZED "); |
| } |
| |
| // specialWiring |
| if (net->numWires()) { |
| newLayer = 0; |
| for (i = 0; i < net->numWires(); i++) { |
| newLayer = 0; |
| wire = net->wire(i); |
| fprintf(fout, "\n + %s ", wire->wireType()); |
| if (strcmp (wire->wireType(), "SHIELD") == 0) |
| fprintf(fout, "%s ", wire->wireShieldNetName()); |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->initTraverse(); |
| if (testDebugPrint) { |
| p->print(fout); |
| } else { |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_VIADATA: |
| p->getViaData(&numX, &numY, &stepX, &stepY); |
| fprintf(fout, "DO %d BY %d STEP %d %d ", numX, numY, |
| stepX, stepY); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_SHAPE: |
| fprintf(fout, "+ SHAPE %s ", p->getShape()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "+ STYLE %d ", p->getStyle()); |
| break; |
| } |
| } |
| } |
| } |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| } |
| |
| // POLYGON |
| if (net->numPolygons()) { |
| struct defiPoints points; |
| |
| for (i = 0; i < net->numPolygons(); i++) { |
| if (curVer >= 5.8 ) { |
| if (strcmp(net->polyRouteStatus(i), "") != 0) { |
| fprintf(fout, "\n + %s ", net->polyRouteStatus(i)); |
| if (strcmp(net->polyRouteStatus(i), "SHIELD") == 0) { |
| fprintf(fout, "\n + %s ", net->polyRouteStatusShieldName(i)); |
| } |
| } |
| if (strcmp(net->polyShapeType(i), "") != 0) { |
| fprintf(fout, "\n + SHAPE %s ", net->polyShapeType(i)); |
| } |
| } |
| if (net->polyMask(i)) { |
| fprintf(fout, "\n + MASK %d + POLYGON % s ", net->polyMask(i), |
| net->polygonName(i)); |
| } else { |
| fprintf(fout, "\n + POLYGON %s ", net->polygonName(i)); |
| } |
| points = net->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| } |
| } |
| // RECT |
| if (net->numRectangles()) { |
| |
| for (i = 0; i < net->numRectangles(); i++) { |
| if (curVer >= 5.8 ) { |
| if (strcmp(net->rectRouteStatus(i), "") != 0) { |
| fprintf(fout, "\n + %s ", net->rectRouteStatus(i)); |
| if (strcmp(net->rectRouteStatus(i), "SHIELD") == 0) { |
| fprintf(fout, "\n + %s ", net->rectRouteStatusShieldName(i)); |
| } |
| } |
| if (strcmp(net->rectShapeType(i), "") != 0) { |
| fprintf(fout, "\n + SHAPE %s ", net->rectShapeType(i)); |
| } |
| } |
| if (net->rectMask(i)) { |
| fprintf(fout, "\n + MASK %d + RECT %s %d %d %d %d", |
| net->rectMask(i), net->rectName(i), |
| net->xl(i), net->yl(i), net->xh(i), |
| net->yh(i)); |
| } else { |
| fprintf(fout, "\n + RECT %s %d %d %d %d", |
| net->rectName(i), |
| net->xl(i), |
| net->yl(i), |
| net->xh(i), |
| net->yh(i)); |
| } |
| } |
| } |
| // VIA |
| if (curVer >= 5.8 && net->numViaSpecs()) { |
| for (i = 0; i < net->numViaSpecs(); i++) { |
| if (strcmp(net->viaRouteStatus(i), "") != 0) { |
| fprintf(fout, "\n + %s ", net->viaRouteStatus(i)); |
| if (strcmp(net->viaRouteStatus(i), "SHIELD") == 0) { |
| fprintf(fout, "\n + %s ", net->viaRouteStatusShieldName(i)); |
| } |
| } |
| if (strcmp(net->viaShapeType(i), "") != 0) { |
| fprintf(fout, "\n + SHAPE %s ", net->viaShapeType(i)); |
| } |
| if (net->topMaskNum(i) || net->cutMaskNum(i) || net->bottomMaskNum(i)) { |
| fprintf(fout, "\n + MASK %d%d%d + VIA %s ", net->topMaskNum(i), |
| net->cutMaskNum(i), |
| net->bottomMaskNum(i), |
| net->viaName(i)); |
| } else { |
| fprintf(fout, "\n + VIA %s ", net->viaName(i)); |
| } |
| fprintf(fout, " %s", net->viaOrientStr(i)); |
| |
| defiPoints points = net->getViaPts(i); |
| |
| for (int j = 0; j < points.numPoints; j++) { |
| fprintf(fout, " %d %d", points.x[j], points.y[j]); |
| } |
| fprintf(fout, ";\n"); |
| |
| } |
| } |
| |
| if (net->hasSubnets()) { |
| for (i = 0; i < net->numSubnets(); i++) { |
| s = net->subnet(i); |
| if (s->numConnections()) { |
| if (s->pinIsMustJoin(0)) |
| fprintf(fout, "- MUSTJOIN "); |
| else |
| fprintf(fout, "- %s ", s->name()); |
| for (j = 0; j < s->numConnections(); j++) { |
| fprintf(fout, " ( %s %s )\n", s->instance(j), |
| s->pin(j)); |
| } |
| } |
| |
| // regularWiring |
| if (s->numWires()) { |
| for (i = 0; i < s->numWires(); i++) { |
| wire = s->wire(i); |
| fprintf(fout, " + %s ", wire->wireType()); |
| for (j = 0; j < wire->numPaths(); j++) { |
| p = wire->path(j); |
| p->print(fout); |
| } |
| } |
| } |
| } |
| } |
| |
| if (net->numProps()) { |
| for (i = 0; i < net->numProps(); i++) { |
| if (net->propIsString(i)) |
| fprintf(fout, " + PROPERTY %s %s ", net->propName(i), |
| net->propValue(i)); |
| if (net->propIsNumber(i)) |
| fprintf(fout, " + PROPERTY %s %g ", net->propName(i), |
| net->propNumber(i)); |
| switch (net->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| fprintf(fout, "\n"); |
| } |
| } |
| |
| // SHIELD |
| count = 0; |
| // testing the SHIELD for 5.3, obsolete in 5.4 |
| if (net->numShields()) { |
| for (i = 0; i < net->numShields(); i++) { |
| shield = net->shield(i); |
| fprintf(fout, "\n + SHIELD %s ", shield->shieldName()); |
| newLayer = 0; |
| for (j = 0; j < shield->numPaths(); j++) { |
| p = shield->path(j); |
| p->initTraverse(); |
| while ((path = (int)p->next()) != DEFIPATH_DONE) { |
| count++; |
| // Don't want the line to be too long |
| if (count >= 5) { |
| fprintf(fout, "\n"); |
| count = 0; |
| } |
| switch (path) { |
| case DEFIPATH_LAYER: |
| if (newLayer == 0) { |
| fprintf(fout, "%s ", p->getLayer()); |
| newLayer = 1; |
| } else |
| fprintf(fout, "NEW %s ", p->getLayer()); |
| break; |
| case DEFIPATH_VIA: |
| fprintf(fout, "%s ", ignoreViaNames ? "XXX" : p->getVia()); |
| break; |
| case DEFIPATH_VIAROTATION: |
| fprintf(fout, "%s ", |
| orientStr(p->getViaRotation())); |
| break; |
| case DEFIPATH_WIDTH: |
| fprintf(fout, "%d ", p->getWidth()); |
| break; |
| case DEFIPATH_MASK: |
| fprintf(fout, "MASK %d ", p->getMask()); |
| break; |
| case DEFIPATH_VIAMASK: |
| fprintf(fout, "MASK %d%d%d ", |
| p->getViaTopMask(), |
| p->getViaCutMask(), |
| p->getViaBottomMask()); |
| break; |
| case DEFIPATH_POINT: |
| p->getPoint(&x, &y); |
| fprintf(fout, "( %d %d ) ", x, y); |
| break; |
| case DEFIPATH_FLUSHPOINT: |
| p->getFlushPoint(&x, &y, &z); |
| fprintf(fout, "( %d %d %d ) ", x, y, z); |
| break; |
| case DEFIPATH_TAPER: |
| fprintf(fout, "TAPER "); |
| break; |
| case DEFIPATH_SHAPE: |
| fprintf(fout, "+ SHAPE %s ", p->getShape()); |
| break; |
| case DEFIPATH_STYLE: |
| fprintf(fout, "+ STYLE %d ", p->getStyle()); |
| break; |
| } |
| } |
| } |
| } |
| } |
| |
| // layerName width |
| if (net->hasWidthRules()) { |
| for (i = 0; i < net->numWidthRules(); i++) { |
| net->widthRule(i, &layerName, &dist); |
| fprintf (fout, "\n + WIDTH %s %g ", layerName, dist); |
| } |
| } |
| |
| // layerName spacing |
| if (net->hasSpacingRules()) { |
| for (i = 0; i < net->numSpacingRules(); i++) { |
| net->spacingRule(i, &layerName, &dist, &left, &right); |
| if (left == right) |
| fprintf (fout, "\n + SPACING %s %g ", layerName, dist); |
| else |
| fprintf (fout, "\n + SPACING %s %g RANGE %g %g ", |
| layerName, dist, left, right); |
| } |
| } |
| |
| if (net->hasFixedbump()) |
| fprintf(fout, "\n + FIXEDBUMP "); |
| if (net->hasFrequency()) |
| fprintf(fout, "\n + FREQUENCY %g ", net->frequency()); |
| if (net->hasVoltage()) |
| fprintf(fout, "\n + VOLTAGE %g ", net->voltage()); |
| if (net->hasWeight()) |
| fprintf(fout, "\n + WEIGHT %d ", net->weight()); |
| if (net->hasCap()) |
| fprintf(fout, "\n + ESTCAP %g ", net->cap()); |
| if (net->hasSource()) |
| fprintf(fout, "\n + SOURCE %s ", net->source()); |
| if (net->hasPattern()) |
| fprintf(fout, "\n + PATTERN %s ", net->pattern()); |
| if (net->hasOriginal()) |
| fprintf(fout, "\n + ORIGINAL %s ", net->original()); |
| if (net->hasUse()) |
| fprintf(fout, "\n + USE %s ", net->use()); |
| |
| fprintf (fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END SPECIALNETS\n"); |
| return 0; |
| } |
| |
| |
| int ndr(defrCallbackType_e c, defiNonDefault* nd, defiUserData ud) { |
| // For nondefaultrule |
| int i; |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (c != defrNonDefaultCbkType) |
| fprintf(fout, "BOGUS NONDEFAULTRULE TYPE "); |
| fprintf(fout, "- %s\n", nd->name()); |
| if (nd->hasHardspacing()) |
| fprintf(fout, " + HARDSPACING\n"); |
| for (i = 0; i < nd->numLayers(); i++) { |
| fprintf(fout, " + LAYER %s", nd->layerName(i)); |
| fprintf(fout, " WIDTH %d", nd->layerWidthVal(i)); |
| if (nd->hasLayerDiagWidth(i)) |
| fprintf(fout, " DIAGWIDTH %d", |
| nd->layerDiagWidthVal(i)); |
| if (nd->hasLayerSpacing(i)) |
| fprintf(fout, " SPACING %d", nd->layerSpacingVal(i)); |
| if (nd->hasLayerWireExt(i)) |
| fprintf(fout, " WIREEXT %d", nd->layerWireExtVal(i)); |
| fprintf(fout, "\n"); |
| } |
| for (i = 0; i < nd->numVias(); i++) |
| fprintf(fout, " + VIA %s\n", nd->viaName(i)); |
| for (i = 0; i < nd->numViaRules(); i++) |
| fprintf(fout, " + VIARULE %s\n", ignoreViaNames ? "XXX" : nd->viaRuleName(i)); |
| for (i = 0; i < nd->numMinCuts(); i++) |
| fprintf(fout, " + MINCUTS %s %d\n", nd->cutLayerName(i), |
| nd->numCuts(i)); |
| for (i = 0; i < nd->numProps(); i++) { |
| fprintf(fout, " + PROPERTY %s %s ", nd->propName(i), |
| nd->propValue(i)); |
| switch (nd->propType(i)) { |
| case 'R': fprintf(fout, "REAL\n"); |
| break; |
| case 'I': fprintf(fout, "INTEGER\n"); |
| break; |
| case 'S': fprintf(fout, "STRING\n"); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING\n"); |
| break; |
| case 'N': fprintf(fout, "NUMBER\n"); |
| break; |
| } |
| } |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END NONDEFAULTRULES\n"); |
| return 0; |
| } |
| |
| int tname(defrCallbackType_e c, const char* string, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "TECHNOLOGY %s ;\n", string); |
| return 0; |
| } |
| |
| int dname(defrCallbackType_e c, const char* string, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "DESIGN %s ;\n", string); |
| |
| return 0; |
| } |
| |
| |
| char* address(const char* in) { |
| return ((char*)in); |
| } |
| |
| int cs(defrCallbackType_e c, int num, defiUserData ud) { |
| char* name; |
| |
| checkType(c); |
| |
| if (ud != userData) dataError(); |
| |
| switch (c) { |
| case defrComponentStartCbkType : name = address("COMPONENTS"); break; |
| case defrNetStartCbkType : name = address("NETS"); break; |
| case defrStartPinsCbkType : name = address("PINS"); break; |
| case defrViaStartCbkType : name = address("VIAS"); break; |
| case defrRegionStartCbkType : name = address("REGIONS"); break; |
| case defrSNetStartCbkType : name = address("SPECIALNETS"); break; |
| case defrGroupsStartCbkType : name = address("GROUPS"); break; |
| case defrScanchainsStartCbkType : name = address("SCANCHAINS"); break; |
| case defrIOTimingsStartCbkType : name = address("IOTIMINGS"); break; |
| case defrFPCStartCbkType : name = address("FLOORPLANCONSTRAINTS"); break; |
| case defrTimingDisablesStartCbkType : name = address("TIMING DISABLES"); break; |
| case defrPartitionsStartCbkType : name = address("PARTITIONS"); break; |
| case defrPinPropStartCbkType : name = address("PINPROPERTIES"); break; |
| case defrBlockageStartCbkType : name = address("BLOCKAGES"); break; |
| case defrSlotStartCbkType : name = address("SLOTS"); break; |
| case defrFillStartCbkType : name = address("FILLS"); break; |
| case defrNonDefaultStartCbkType : name = address("NONDEFAULTRULES"); break; |
| case defrStylesStartCbkType : name = address("STYLES"); break; |
| default : name = address("BOGUS"); return 1; |
| } |
| fprintf(fout, "\n%s %d ;\n", name, num); |
| numObjs = num; |
| return 0; |
| } |
| |
| int constraintst(defrCallbackType_e c, int num, defiUserData ud) { |
| // Handles both constraints and assertions |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (c == defrConstraintsStartCbkType) |
| fprintf(fout, "\nCONSTRAINTS %d ;\n\n", num); |
| else |
| fprintf(fout, "\nASSERTIONS %d ;\n\n", num); |
| numObjs = num; |
| return 0; |
| } |
| |
| void operand(defrCallbackType_e c, defiAssertion* a, int ind) { |
| int i, first = 1; |
| char* netName; |
| char* fromInst, * fromPin, * toInst, * toPin; |
| |
| if (a->isSum()) { |
| // Sum in operand, recursively call operand |
| fprintf(fout, "- SUM ( "); |
| a->unsetSum(); |
| isSumSet = 1; |
| begOperand = 0; |
| operand (c, a, ind); |
| fprintf(fout, ") "); |
| } else { |
| // operand |
| if (ind >= a->numItems()) { |
| fprintf(fout, "ERROR: when writing out SUM in Constraints.\n"); |
| return; |
| } |
| if (begOperand) { |
| fprintf(fout, "- "); |
| begOperand = 0; |
| } |
| for (i = ind; i < a->numItems(); i++) { |
| if (a->isNet(i)) { |
| a->net(i, &netName); |
| if (!first) |
| fprintf(fout, ", "); // print , as separator |
| fprintf(fout, "NET %s ", netName); |
| } else if (a->isPath(i)) { |
| a->path(i, &fromInst, &fromPin, &toInst, |
| &toPin); |
| if (!first) |
| fprintf(fout, ", "); |
| fprintf(fout, "PATH %s %s %s %s ", fromInst, fromPin, toInst, |
| toPin); |
| } else if (isSumSet) { |
| // SUM within SUM, reset the flag |
| a->setSum(); |
| operand(c, a, i); |
| } |
| first = 0; |
| } |
| |
| } |
| } |
| |
| int constraint(defrCallbackType_e c, defiAssertion* a, defiUserData ud) { |
| // Handles both constraints and assertions |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (a->isWiredlogic()) |
| // Wirelogic |
| fprintf(fout, "- WIREDLOGIC %s + MAXDIST %g ;\n", |
| // Wiredlogic dist is also store in fallMax |
| // a->netName(), a->distance()); |
| a->netName(), a->fallMax()); |
| else { |
| // Call the operand function |
| isSumSet = 0; // reset the global variable |
| begOperand = 1; |
| operand (c, a, 0); |
| // Get the Rise and Fall |
| if (a->hasRiseMax()) |
| fprintf(fout, "+ RISEMAX %g ", a->riseMax()); |
| if (a->hasFallMax()) |
| fprintf(fout, "+ FALLMAX %g ", a->fallMax()); |
| if (a->hasRiseMin()) |
| fprintf(fout, "+ RISEMIN %g ", a->riseMin()); |
| if (a->hasFallMin()) |
| fprintf(fout, "+ FALLMIN %g ", a->fallMin()); |
| fprintf(fout, ";\n"); |
| } |
| --numObjs; |
| if (numObjs <= 0) { |
| if (c == defrConstraintCbkType) |
| fprintf(fout, "END CONSTRAINTS\n"); |
| else |
| fprintf(fout, "END ASSERTIONS\n"); |
| } |
| return 0; |
| } |
| |
| |
| int propstart(defrCallbackType_e c, void*, defiUserData) { |
| checkType(c); |
| fprintf(fout, "\nPROPERTYDEFINITIONS\n"); |
| isProp = 1; |
| |
| return 0; |
| } |
| |
| |
| int prop(defrCallbackType_e c, defiProp* p, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (strcmp(p->propType(), "design") == 0) |
| fprintf(fout, "DESIGN %s ", p->propName()); |
| else if (strcmp(p->propType(), "net") == 0) |
| fprintf(fout, "NET %s ", p->propName()); |
| else if (strcmp(p->propType(), "component") == 0) |
| fprintf(fout, "COMPONENT %s ", p->propName()); |
| else if (strcmp(p->propType(), "specialnet") == 0) |
| fprintf(fout, "SPECIALNET %s ", p->propName()); |
| else if (strcmp(p->propType(), "group") == 0) |
| fprintf(fout, "GROUP %s ", p->propName()); |
| else if (strcmp(p->propType(), "row") == 0) |
| fprintf(fout, "ROW %s ", p->propName()); |
| else if (strcmp(p->propType(), "componentpin") == 0) |
| fprintf(fout, "COMPONENTPIN %s ", p->propName()); |
| else if (strcmp(p->propType(), "region") == 0) |
| fprintf(fout, "REGION %s ", p->propName()); |
| else if (strcmp(p->propType(), "nondefaultrule") == 0) |
| fprintf(fout, "NONDEFAULTRULE %s ", p->propName()); |
| if (p->dataType() == 'I') |
| fprintf(fout, "INTEGER "); |
| if (p->dataType() == 'R') |
| fprintf(fout, "REAL "); |
| if (p->dataType() == 'S') |
| fprintf(fout, "STRING "); |
| if (p->dataType() == 'Q') |
| fprintf(fout, "STRING "); |
| if (p->hasRange()) { |
| fprintf(fout, "RANGE %g %g ", p->left(), |
| p->right()); |
| } |
| if (p->hasNumber()) |
| fprintf(fout, "%g ", p->number()); |
| if (p->hasString()) |
| fprintf(fout, "\"%s\" ", p->string()); |
| fprintf(fout, ";\n"); |
| |
| return 0; |
| } |
| |
| |
| int propend(defrCallbackType_e c, void*, defiUserData) { |
| checkType(c); |
| if (isProp) { |
| fprintf(fout, "END PROPERTYDEFINITIONS\n\n"); |
| isProp = 0; |
| } |
| |
| return 0; |
| } |
| |
| |
| int hist(defrCallbackType_e c, const char* h, defiUserData ud) { |
| checkType(c); |
| defrSetCaseSensitivity(0); |
| if (ud != userData) dataError(); |
| fprintf(fout, "HISTORY %s ;\n", h); |
| defrSetCaseSensitivity(1); |
| return 0; |
| } |
| |
| |
| int an(defrCallbackType_e c, const char* h, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "ARRAY %s ;\n", h); |
| return 0; |
| } |
| |
| |
| int fn(defrCallbackType_e c, const char* h, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "FLOORPLAN %s ;\n", h); |
| return 0; |
| } |
| |
| |
| int bbn(defrCallbackType_e c, const char* h, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "BUSBITCHARS \"%s\" ;\n", h); |
| return 0; |
| } |
| |
| |
| int vers(defrCallbackType_e c, double d, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) |
| dataError(); |
| fprintf(fout, "VERSION %g ;\n", d); |
| curVer = d; |
| |
| fprintf(fout, "ALIAS alias1 aliasValue1 1 ;\n"); |
| fprintf(fout, "ALIAS alias2 aliasValue2 0 ;\n"); |
| |
| return 0; |
| } |
| |
| |
| int versStr(defrCallbackType_e c, const char* versionName, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "VERSION %s ;\n", versionName); |
| return 0; |
| } |
| |
| |
| int units(defrCallbackType_e c, double d, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "UNITS DISTANCE MICRONS %g ;\n", d); |
| return 0; |
| } |
| |
| |
| int casesens(defrCallbackType_e c, int d, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| if (d == 1) |
| fprintf(fout, "NAMESCASESENSITIVE ON ;\n", d); |
| else |
| fprintf(fout, "NAMESCASESENSITIVE OFF ;\n", d); |
| return 0; |
| } |
| |
| |
| int cls(defrCallbackType_e c, void* cl, defiUserData ud) { |
| defiSite* site; // Site and Canplace and CannotOccupy |
| defiBox* box; // DieArea and |
| defiPinCap* pc; |
| defiPin* pin; |
| int i, j, k; |
| defiRow* row; |
| defiTrack* track; |
| defiGcellGrid* gcg; |
| defiVia* via; |
| defiRegion* re; |
| defiGroup* group; |
| defiComponentMaskShiftLayer* maskShiftLayer = NULL; |
| defiScanchain* sc; |
| defiIOTiming* iot; |
| defiFPC* fpc; |
| defiTimingDisable* td; |
| defiPartition* part; |
| defiPinProp* pprop; |
| defiBlockage* block; |
| defiSlot* slots; |
| defiFill* fills; |
| defiStyles* styles; |
| int xl, yl, xh, yh; |
| char *name, *a1, *b1; |
| char **inst, **inPin, **outPin; |
| int *bits; |
| int size; |
| int corner, typ; |
| const char *itemT; |
| char dir; |
| defiPinAntennaModel* aModel; |
| struct defiPoints points; |
| |
| checkType(c); |
| if (ud != userData) dataError(); |
| switch (c) { |
| |
| case defrSiteCbkType : |
| site = (defiSite*)cl; |
| fprintf(fout, "SITE %s %g %g %s ", site->name(), |
| site->x_orig(), site->y_orig(), |
| orientStr(site->orient())); |
| fprintf(fout, "DO %g BY %g STEP %g %g ;\n", |
| site->x_num(), site->y_num(), |
| site->x_step(), site->y_step()); |
| break; |
| case defrCanplaceCbkType : |
| site = (defiSite*)cl; |
| fprintf(fout, "CANPLACE %s %g %g %s ", site->name(), |
| site->x_orig(), site->y_orig(), |
| orientStr(site->orient())); |
| fprintf(fout, "DO %g BY %g STEP %g %g ;\n", |
| site->x_num(), site->y_num(), |
| site->x_step(), site->y_step()); |
| break; |
| case defrCannotOccupyCbkType : |
| site = (defiSite*)cl; |
| fprintf(fout, "CANNOTOCCUPY %s %g %g %s ", |
| site->name(), site->x_orig(), |
| site->y_orig(), orientStr(site->orient())); |
| fprintf(fout, "DO %g BY %g STEP %g %g ;\n", |
| site->x_num(), site->y_num(), |
| site->x_step(), site->y_step()); |
| break; |
| case defrDieAreaCbkType : |
| box = (defiBox*)cl; |
| fprintf(fout, "DIEAREA %d %d %d %d ;\n", |
| box->xl(), box->yl(), box->xh(), |
| box->yh()); |
| fprintf(fout, "DIEAREA "); |
| points = box->getPoint(); |
| for (i = 0; i < points.numPoints; i++) |
| fprintf(fout, "%d %d ", points.x[i], points.y[i]); |
| fprintf(fout, ";\n"); |
| break; |
| case defrPinCapCbkType : |
| pc = (defiPinCap*)cl; |
| if (testDebugPrint) { |
| pc->print(fout); |
| } else { |
| fprintf(fout, "MINPINS %d WIRECAP %g ;\n", |
| pc->pin(), pc->cap()); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END DEFAULTCAP\n"); |
| } |
| break; |
| case defrPinCbkType : |
| pin = (defiPin*)cl; |
| if (testDebugPrint) { |
| pin->print(fout); |
| } else { |
| fprintf(fout, "- %s + NET %s ", pin->pinName(), |
| pin->netName()); |
| // pin->changePinName("pinName"); |
| // fprintf(fout, "%s ", pin->pinName()); |
| if (pin->hasDirection()) |
| fprintf(fout, "+ DIRECTION %s ", pin->direction()); |
| if (pin->hasUse()) |
| fprintf(fout, "+ USE %s ", pin->use()); |
| if (pin->hasNetExpr()) |
| fprintf(fout, "+ NETEXPR \"%s\" ", pin->netExpr()); |
| if (pin->hasSupplySensitivity()) |
| fprintf(fout, "+ SUPPLYSENSITIVITY %s ", |
| pin->supplySensitivity()); |
| if (pin->hasGroundSensitivity()) |
| fprintf(fout, "+ GROUNDSENSITIVITY %s ", |
| pin->groundSensitivity()); |
| if (pin->hasLayer()) { |
| struct defiPoints points; |
| for (i = 0; i < pin->numLayer(); i++) { |
| fprintf(fout, "\n + LAYER %s ", pin->layer(i)); |
| if (pin->layerMask(i)) |
| fprintf(fout, "MASK %d ", |
| pin->layerMask(i)); |
| if (pin->hasLayerSpacing(i)) |
| fprintf(fout, "SPACING %d ", |
| pin->layerSpacing(i)); |
| if (pin->hasLayerDesignRuleWidth(i)) |
| fprintf(fout, "DESIGNRULEWIDTH %d ", |
| pin->layerDesignRuleWidth(i)); |
| pin->bounds(i, &xl, &yl, &xh, &yh); |
| fprintf(fout, "%d %d %d %d ", xl, yl, xh, yh); |
| } |
| for (i = 0; i < pin->numPolygons(); i++) { |
| fprintf(fout, "\n + POLYGON %s ", |
| pin->polygonName(i)); |
| if (pin->polygonMask(i)) |
| fprintf(fout, "MASK %d ", |
| pin->polygonMask(i)); |
| if (pin->hasPolygonSpacing(i)) |
| fprintf(fout, "SPACING %d ", |
| pin->polygonSpacing(i)); |
| if (pin->hasPolygonDesignRuleWidth(i)) |
| fprintf(fout, "DESIGNRULEWIDTH %d ", |
| pin->polygonDesignRuleWidth(i)); |
| points = pin->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| } |
| for (i = 0; i < pin->numVias(); i++) { |
| if (pin->viaTopMask(i) || pin->viaCutMask(i) || pin->viaBottomMask(i)) { |
| fprintf(fout, "\n + VIA %s MASK %d%d%d %d %d ", |
| pin->viaName(i), |
| pin->viaTopMask(i), |
| pin->viaCutMask(i), |
| pin->viaBottomMask(i), |
| pin->viaPtX(i), |
| pin->viaPtY(i)); |
| } else { |
| fprintf(fout, "\n + VIA %s %d %d ", pin->viaName(i), |
| pin->viaPtX(i), pin->viaPtY(i)); |
| } |
| } |
| } |
| if (pin->hasPort()) { |
| struct defiPoints points; |
| defiPinPort* port; |
| for (j = 0; j < pin->numPorts(); j++) { |
| port = pin->pinPort(j); |
| fprintf(fout, "\n + PORT"); |
| for (i = 0; i < port->numLayer(); i++) { |
| fprintf(fout, "\n + LAYER %s ", |
| port->layer(i)); |
| if (port->layerMask(i)) |
| fprintf(fout, "MASK %d ", |
| port->layerMask(i)); |
| if (port->hasLayerSpacing(i)) |
| fprintf(fout, "SPACING %d ", |
| port->layerSpacing(i)); |
| if (port->hasLayerDesignRuleWidth(i)) |
| fprintf(fout, "DESIGNRULEWIDTH %d ", |
| port->layerDesignRuleWidth(i)); |
| port->bounds(i, &xl, &yl, &xh, &yh); |
| fprintf(fout, "%d %d %d %d ", xl, yl, xh, yh); |
| } |
| for (i = 0; i < port->numPolygons(); i++) { |
| fprintf(fout, "\n + POLYGON %s ", |
| port->polygonName(i)); |
| if (port->polygonMask(i)) |
| fprintf(fout, "MASK %d ", |
| port->polygonMask(i)); |
| if (port->hasPolygonSpacing(i)) |
| fprintf(fout, "SPACING %d ", |
| port->polygonSpacing(i)); |
| if (port->hasPolygonDesignRuleWidth(i)) |
| fprintf(fout, "DESIGNRULEWIDTH %d ", |
| port->polygonDesignRuleWidth(i)); |
| points = port->getPolygon(i); |
| for (k = 0; k < points.numPoints; k++) |
| fprintf(fout, "( %d %d ) ", points.x[k], points.y[k]); |
| } |
| for (i = 0; i < port->numVias(); i++) { |
| if (port->viaTopMask(i) || port->viaCutMask(i) |
| || port->viaBottomMask(i)) { |
| fprintf(fout, "\n + VIA %s MASK %d%d%d ( %d %d ) ", |
| port->viaName(i), |
| port->viaTopMask(i), |
| port->viaCutMask(i), |
| port->viaBottomMask(i), |
| port->viaPtX(i), |
| port->viaPtY(i)); |
| } else { |
| fprintf(fout, "\n + VIA %s ( %d %d ) ", |
| port->viaName(i), |
| port->viaPtX(i), |
| port->viaPtY(i)); |
| } |
| } |
| if (port->hasPlacement()) { |
| if (port->isPlaced()) { |
| fprintf(fout, "\n + PLACED "); |
| fprintf(fout, "( %d %d ) %s ", |
| port->placementX(), |
| port->placementY(), |
| orientStr(port->orient())); |
| } |
| if (port->isCover()) { |
| fprintf(fout, "\n + COVER "); |
| fprintf(fout, "( %d %d ) %s ", |
| port->placementX(), |
| port->placementY(), |
| orientStr(port->orient())); |
| } |
| if (port->isFixed()) { |
| fprintf(fout, "\n + FIXED "); |
| fprintf(fout, "( %d %d ) %s ", |
| port->placementX(), |
| port->placementY(), |
| orientStr(port->orient())); |
| } |
| } |
| } |
| } |
| if (pin->hasPlacement()) { |
| if (pin->isPlaced()) { |
| fprintf(fout, "+ PLACED "); |
| fprintf(fout, "( %d %d ) %s ", pin->placementX(), |
| pin->placementY(), |
| orientStr(pin->orient())); |
| } |
| if (pin->isCover()) { |
| fprintf(fout, "+ COVER "); |
| fprintf(fout, "( %d %d ) %s ", pin->placementX(), |
| pin->placementY(), |
| orientStr(pin->orient())); |
| } |
| if (pin->isFixed()) { |
| fprintf(fout, "+ FIXED "); |
| fprintf(fout, "( %d %d ) %s ", pin->placementX(), |
| pin->placementY(), |
| orientStr(pin->orient())); |
| } |
| if (pin->isUnplaced()) |
| fprintf(fout, "+ UNPLACED "); |
| } |
| if (pin->hasSpecial()) { |
| fprintf(fout, "+ SPECIAL "); |
| } |
| if (pin->hasAPinPartialMetalArea()) { |
| for (i = 0; i < pin->numAPinPartialMetalArea(); i++) { |
| fprintf(fout, "ANTENNAPINPARTIALMETALAREA %d", |
| pin->APinPartialMetalArea(i)); |
| if (*(pin->APinPartialMetalAreaLayer(i))) |
| fprintf(fout, " LAYER %s", |
| pin->APinPartialMetalAreaLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| if (pin->hasAPinPartialMetalSideArea()) { |
| for (i = 0; i < pin->numAPinPartialMetalSideArea(); i++) { |
| fprintf(fout, "ANTENNAPINPARTIALMETALSIDEAREA %d", |
| pin->APinPartialMetalSideArea(i)); |
| if (*(pin->APinPartialMetalSideAreaLayer(i))) |
| fprintf(fout, " LAYER %s", |
| pin->APinPartialMetalSideAreaLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| if (pin->hasAPinDiffArea()) { |
| for (i = 0; i < pin->numAPinDiffArea(); i++) { |
| fprintf(fout, "ANTENNAPINDIFFAREA %d", pin->APinDiffArea(i)); |
| if (*(pin->APinDiffAreaLayer(i))) |
| fprintf(fout, " LAYER %s", pin->APinDiffAreaLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| if (pin->hasAPinPartialCutArea()) { |
| for (i = 0; i < pin->numAPinPartialCutArea(); i++) { |
| fprintf(fout, "ANTENNAPINPARTIALCUTAREA %d", |
| pin->APinPartialCutArea(i)); |
| if (*(pin->APinPartialCutAreaLayer(i))) |
| fprintf(fout, " LAYER %s", pin->APinPartialCutAreaLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| |
| for (j = 0; j < pin->numAntennaModel(); j++) { |
| aModel = pin->antennaModel(j); |
| |
| fprintf(fout, "ANTENNAMODEL %s\n", |
| aModel->antennaOxide()); |
| |
| if (aModel->hasAPinGateArea()) { |
| for (i = 0; i < aModel->numAPinGateArea(); |
| i++) { |
| fprintf(fout, "ANTENNAPINGATEAREA %d", |
| aModel->APinGateArea(i)); |
| if (aModel->hasAPinGateAreaLayer(i)) |
| fprintf(fout, " LAYER %s", aModel->APinGateAreaLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| if (aModel->hasAPinMaxAreaCar()) { |
| for (i = 0; |
| i < aModel->numAPinMaxAreaCar(); i++) { |
| fprintf(fout, "ANTENNAPINMAXAREACAR %d", |
| aModel->APinMaxAreaCar(i)); |
| if (aModel->hasAPinMaxAreaCarLayer(i)) |
| fprintf(fout, |
| " LAYER %s", aModel->APinMaxAreaCarLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| if (aModel->hasAPinMaxSideAreaCar()) { |
| for (i = 0; |
| i < aModel->numAPinMaxSideAreaCar(); |
| i++) { |
| fprintf(fout, "ANTENNAPINMAXSIDEAREACAR %d", |
| aModel->APinMaxSideAreaCar(i)); |
| if (aModel->hasAPinMaxSideAreaCarLayer(i)) |
| fprintf(fout, |
| " LAYER %s", aModel->APinMaxSideAreaCarLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| if (aModel->hasAPinMaxCutCar()) { |
| for (i = 0; i < aModel->numAPinMaxCutCar(); |
| i++) { |
| fprintf(fout, "ANTENNAPINMAXCUTCAR %d", |
| aModel->APinMaxCutCar(i)); |
| if (aModel->hasAPinMaxCutCarLayer(i)) |
| fprintf(fout, " LAYER %s", |
| aModel->APinMaxCutCarLayer(i)); |
| fprintf(fout, "\n"); |
| } |
| } |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END PINS\n"); |
| } |
| break; |
| case defrDefaultCapCbkType : |
| i = (long)cl; |
| fprintf(fout, "DEFAULTCAP %d\n", i); |
| numObjs = i; |
| break; |
| case defrRowCbkType : |
| row = (defiRow*)cl; |
| fprintf(fout, "ROW %s %s %g %g %s ", ignoreRowNames ? "XXX" : row->name(), |
| row->macro(), row->x(), row->y(), |
| orientStr(row->orient())); |
| if (row->hasDo()) { |
| fprintf(fout, "DO %g BY %g ", |
| row->xNum(), row->yNum()); |
| if (row->hasDoStep()) |
| fprintf(fout, "STEP %g %g ;\n", |
| row->xStep(), row->yStep()); |
| else |
| fprintf(fout, ";\n"); |
| } else |
| fprintf(fout, ";\n"); |
| if (row->numProps() > 0) { |
| for (i = 0; i < row->numProps(); i++) { |
| fprintf(fout, " + PROPERTY %s %s ", |
| row->propName(i), |
| row->propValue(i)); |
| switch (row->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| } |
| fprintf(fout, ";\n"); |
| } |
| break; |
| case defrTrackCbkType : |
| track = (defiTrack*)cl; |
| if (track->firstTrackMask()) { |
| if (track->sameMask()) { |
| fprintf(fout, "TRACKS %s %g DO %g STEP %g MASK %d SAMEMASK LAYER ", |
| track->macro(), track->x(), |
| track->xNum(), track->xStep(), |
| track->firstTrackMask()); |
| } else { |
| fprintf(fout, "TRACKS %s %g DO %g STEP %g MASK %d LAYER ", |
| track->macro(), track->x(), |
| track->xNum(), track->xStep(), |
| track->firstTrackMask()); |
| } |
| } else { |
| fprintf(fout, "TRACKS %s %g DO %g STEP %g LAYER ", |
| track->macro(), track->x(), |
| track->xNum(), track->xStep()); |
| } |
| for (i = 0; i < track->numLayers(); i++) |
| fprintf(fout, "%s ", track->layer(i)); |
| fprintf(fout, ";\n"); |
| break; |
| case defrGcellGridCbkType : |
| gcg = (defiGcellGrid*)cl; |
| fprintf(fout, "GCELLGRID %s %d DO %d STEP %g ;\n", |
| gcg->macro(), gcg->x(), |
| gcg->xNum(), gcg->xStep()); |
| break; |
| case defrViaCbkType : |
| via = (defiVia*)cl; |
| if (testDebugPrint) { |
| via->print(fout); |
| } else { |
| fprintf(fout, "- %s ", via->name()); |
| if (via->hasPattern()) |
| fprintf(fout, "+ PATTERNNAME %s ", via->pattern()); |
| for (i = 0; i < via->numLayers(); i++) { |
| via->layer(i, &name, &xl, &yl, &xh, &yh); |
| int rectMask = via->rectMask(i); |
| |
| if (rectMask) { |
| fprintf(fout, "+ RECT %s + MASK %d %d %d %d %d \n", |
| name, rectMask, xl, yl, xh, yh); |
| } else { |
| fprintf(fout, "+ RECT %s %d %d %d %d \n", |
| name, xl, yl, xh, yh); |
| } |
| } |
| // POLYGON |
| if (via->numPolygons()) { |
| struct defiPoints points; |
| for (i = 0; i < via->numPolygons(); i++) { |
| int polyMask = via->polyMask(i); |
| |
| if (polyMask) { |
| fprintf(fout, "\n + POLYGON %s + MASK %d ", |
| via->polygonName(i), polyMask); |
| } else { |
| fprintf(fout, "\n + POLYGON %s ", via->polygonName(i)); |
| } |
| points = via->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| } |
| } |
| fprintf(fout, " ;\n"); |
| if (via->hasViaRule()) { |
| char *vrn, *bl, *cl, *tl; |
| int xs, ys, xcs, ycs, xbe, ybe, xte, yte; |
| int cr, cc, xo, yo, xbo, ybo, xto, yto; |
| (void)via->viaRule(&vrn, &xs, &ys, &bl, &cl, &tl, &xcs, |
| &ycs, &xbe, &ybe, &xte, &yte); |
| fprintf(fout, "+ VIARULE '%s'\n", ignoreViaNames ? "XXX" : vrn); |
| fprintf(fout, " + CUTSIZE %d %d\n", xs, ys); |
| fprintf(fout, " + LAYERS %s %s %s\n", bl, cl, tl); |
| fprintf(fout, " + CUTSPACING %d %d\n", xcs, ycs); |
| fprintf(fout, " + ENCLOSURE %d %d %d %d\n", xbe, ybe, xte, yte); |
| if (via->hasRowCol()) { |
| (void)via->rowCol(&cr, &cc); |
| fprintf(fout, " + ROWCOL %d %d\n", cr, cc); |
| } |
| if (via->hasOrigin()) { |
| (void)via->origin(&xo, &yo); |
| fprintf(fout, " + ORIGIN %d %d\n", xo, yo); |
| } |
| if (via->hasOffset()) { |
| (void)via->offset(&xbo, &ybo, &xto, &yto); |
| fprintf(fout, " + OFFSET %d %d %d %d\n", xbo, ybo, xto, yto); |
| } |
| if (via->hasCutPattern()) |
| fprintf(fout, " + PATTERN '%s'\n", via->cutPattern()); |
| } |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END VIAS\n"); |
| } |
| break; |
| case defrRegionCbkType : |
| re = (defiRegion*)cl; |
| fprintf(fout, "- %s ", re->name()); |
| for (i = 0; i < re->numRectangles(); i++) |
| fprintf(fout, "%d %d %d %d \n", re->xl(i), |
| re->yl(i), re->xh(i), |
| re->yh(i)); |
| if (re->hasType()) |
| fprintf(fout, "+ TYPE %s\n", re->type()); |
| if (re->numProps()) { |
| for (i = 0; i < re->numProps(); i++) { |
| fprintf(fout, "+ PROPERTY %s %s ", re->propName(i), |
| re->propValue(i)); |
| switch (re->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| } |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) { |
| fprintf(fout, "END REGIONS\n"); |
| } |
| break; |
| case defrGroupNameCbkType : |
| if ((char*)cl) { |
| fprintf(fout, "- %s", (char*)cl); |
| } |
| break; |
| case defrGroupMemberCbkType : |
| if ((char*)cl) { |
| fprintf(fout, " %s", (char*)cl); |
| } |
| break; |
| case defrComponentMaskShiftLayerCbkType : |
| fprintf(fout, "COMPONENTMASKSHIFT "); |
| |
| for (i = 0; i < maskShiftLayer->numMaskShiftLayers(); i++) { |
| fprintf(fout, "%s ", maskShiftLayer->maskShiftLayer(i)); |
| } |
| fprintf(fout, ";\n"); |
| break; |
| case defrGroupCbkType : |
| group = (defiGroup*)cl; |
| if (group->hasMaxX() | group->hasMaxY() |
| | group->hasPerim()) { |
| fprintf(fout, "\n + SOFT "); |
| if (group->hasPerim()) |
| fprintf(fout, "MAXHALFPERIMETER %d ", |
| group->perim()); |
| if (group->hasMaxX()) |
| fprintf(fout, "MAXX %d ", group->maxX()); |
| if (group->hasMaxY()) |
| fprintf(fout, "MAXY %d ", group->maxY()); |
| } |
| if (group->hasRegionName()) |
| fprintf(fout, "\n + REGION %s ", group->regionName()); |
| if (group->hasRegionBox()) { |
| int *gxl, *gyl, *gxh, *gyh; |
| int size; |
| group->regionRects(&size, &gxl, &gyl, &gxh, &gyh); |
| for (i = 0; i < size; i++) |
| fprintf(fout, "REGION %d %d %d %d ", gxl[i], gyl[i], |
| gxh[i], gyh[i]); |
| } |
| if (group->numProps()) { |
| for (i = 0; i < group->numProps(); i++) { |
| fprintf(fout, "\n + PROPERTY %s %s ", |
| group->propName(i), |
| group->propValue(i)); |
| switch (group->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| } |
| } |
| fprintf(fout, " ;\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END GROUPS\n"); |
| break; |
| case defrScanchainCbkType : |
| sc = (defiScanchain*)cl; |
| fprintf(fout, "- %s\n", sc->name()); |
| if (sc->hasStart()) { |
| sc->start(&a1, &b1); |
| fprintf(fout, " + START %s %s\n", a1, b1); |
| } |
| if (sc->hasStop()) { |
| sc->stop(&a1, &b1); |
| fprintf(fout, " + STOP %s %s\n", a1, b1); |
| } |
| if (sc->hasCommonInPin() || |
| sc->hasCommonOutPin()) { |
| fprintf(fout, " + COMMONSCANPINS "); |
| if (sc->hasCommonInPin()) |
| fprintf(fout, " ( IN %s ) ", sc->commonInPin()); |
| if (sc->hasCommonOutPin()) |
| fprintf(fout, " ( OUT %s ) ",sc->commonOutPin()); |
| fprintf(fout, "\n"); |
| } |
| if (sc->hasFloating()) { |
| sc->floating(&size, &inst, &inPin, &outPin, &bits); |
| if (size > 0) |
| fprintf(fout, " + FLOATING\n"); |
| for (i = 0; i < size; i++) { |
| fprintf(fout, " %s ", inst[i]); |
| if (inPin[i]) |
| fprintf(fout, "( IN %s ) ", inPin[i]); |
| if (outPin[i]) |
| fprintf(fout, "( OUT %s ) ", outPin[i]); |
| if (bits[i] != -1) |
| fprintf(fout, "( BITS %d ) ", bits[i]); |
| fprintf(fout, "\n"); |
| } |
| } |
| |
| if (sc->hasOrdered()) { |
| for (i = 0; i < sc->numOrderedLists(); i++) { |
| sc->ordered(i, &size, &inst, &inPin, &outPin, |
| &bits); |
| if (size > 0) |
| fprintf(fout, " + ORDERED\n"); |
| for (j = 0; j < size; j++) { |
| fprintf(fout, " %s ", inst[j]); |
| if (inPin[j]) |
| fprintf(fout, "( IN %s ) ", inPin[j]); |
| if (outPin[j]) |
| fprintf(fout, "( OUT %s ) ", outPin[j]); |
| if (bits[j] != -1) |
| fprintf(fout, "( BITS %d ) ", bits[j]); |
| fprintf(fout, "\n"); |
| } |
| } |
| } |
| |
| if (sc->hasPartition()) { |
| fprintf(fout, " + PARTITION %s ", |
| sc->partitionName()); |
| if (sc->hasPartitionMaxBits()) |
| fprintf(fout, "MAXBITS %d ", |
| sc->partitionMaxBits()); |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END SCANCHAINS\n"); |
| break; |
| case defrIOTimingCbkType : |
| iot = (defiIOTiming*)cl; |
| fprintf(fout, "- ( %s %s )\n", iot->inst(), |
| iot->pin()); |
| if (iot->hasSlewRise()) |
| fprintf(fout, " + RISE SLEWRATE %g %g\n", |
| iot->slewRiseMin(), |
| iot->slewRiseMax()); |
| if (iot->hasSlewFall()) |
| fprintf(fout, " + FALL SLEWRATE %g %g\n", |
| iot->slewFallMin(), |
| iot->slewFallMax()); |
| if (iot->hasVariableRise()) |
| fprintf(fout, " + RISE VARIABLE %g %g\n", |
| iot->variableRiseMin(), |
| iot->variableRiseMax()); |
| if (iot->hasVariableFall()) |
| fprintf(fout, " + FALL VARIABLE %g %g\n", |
| iot->variableFallMin(), |
| iot->variableFallMax()); |
| if (iot->hasCapacitance()) |
| fprintf(fout, " + CAPACITANCE %g\n", |
| iot->capacitance()); |
| if (iot->hasDriveCell()) { |
| fprintf(fout, " + DRIVECELL %s ", |
| iot->driveCell()); |
| if (iot->hasFrom()) |
| fprintf(fout, " FROMPIN %s ", |
| iot->from()); |
| if (iot->hasTo()) |
| fprintf(fout, " TOPIN %s ", |
| iot->to()); |
| if (iot->hasParallel()) |
| fprintf(fout, "PARALLEL %g", |
| iot->parallel()); |
| fprintf(fout, "\n"); |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END IOTIMINGS\n"); |
| break; |
| case defrFPCCbkType : |
| fpc = (defiFPC*)cl; |
| fprintf(fout, "- %s ", fpc->name()); |
| if (fpc->isVertical()) |
| fprintf(fout, "VERTICAL "); |
| if (fpc->isHorizontal()) |
| fprintf(fout, "HORIZONTAL "); |
| if (fpc->hasAlign()) |
| fprintf(fout, "ALIGN "); |
| if (fpc->hasMax()) |
| fprintf(fout, "%g ", fpc->alignMax()); |
| if (fpc->hasMin()) |
| fprintf(fout, "%g ", fpc->alignMin()); |
| if (fpc->hasEqual()) |
| fprintf(fout, "%g ", fpc->equal()); |
| for (i = 0; i < fpc->numParts(); i++) { |
| fpc->getPart(i, &corner, &typ, &name); |
| if (corner == 'B') |
| fprintf(fout, "BOTTOMLEFT "); |
| else |
| fprintf(fout, "TOPRIGHT "); |
| if (typ == 'R') |
| fprintf(fout, "ROWS %s ", name); |
| else |
| fprintf(fout, "COMPS %s ", name); |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END FLOORPLANCONSTRAINTS\n"); |
| break; |
| case defrTimingDisableCbkType : |
| td = (defiTimingDisable*)cl; |
| if (td->hasFromTo()) |
| fprintf(fout, "- FROMPIN %s %s ", |
| td->fromInst(), |
| td->fromPin(), |
| td->toInst(), |
| td->toPin()); |
| if (td->hasThru()) |
| fprintf(fout, "- THRUPIN %s %s ", |
| td->thruInst(), |
| td->thruPin()); |
| if (td->hasMacroFromTo()) |
| fprintf(fout, "- MACRO %s FROMPIN %s %s ", |
| td->macroName(), |
| td->fromPin(), |
| td->toPin()); |
| if (td->hasMacroThru()) |
| fprintf(fout, "- MACRO %s THRUPIN %s %s ", |
| td->macroName(), |
| td->fromPin()); |
| fprintf(fout, ";\n"); |
| break; |
| case defrPartitionCbkType : |
| part = (defiPartition*)cl; |
| fprintf(fout, "- %s ", part->name()); |
| if (part->isSetupRise() | |
| part->isSetupFall() | |
| part->isHoldRise() | |
| part->isHoldFall()) { |
| // has turnoff |
| fprintf(fout, "TURNOFF "); |
| if (part->isSetupRise()) |
| fprintf(fout, "SETUPRISE "); |
| if (part->isSetupFall()) |
| fprintf(fout, "SETUPFALL "); |
| if (part->isHoldRise()) |
| fprintf(fout, "HOLDRISE "); |
| if (part->isHoldFall()) |
| fprintf(fout, "HOLDFALL "); |
| } |
| itemT = part->itemType(); |
| dir = part->direction(); |
| if (strcmp(itemT, "CLOCK") == 0) { |
| if (dir == 'T') // toclockpin |
| fprintf(fout, "+ TOCLOCKPIN %s %s ", |
| part->instName(), |
| part->pinName()); |
| if (dir == 'F') // fromclockpin |
| fprintf(fout, "+ FROMCLOCKPIN %s %s ", |
| part->instName(), |
| part->pinName()); |
| if (part->hasMin()) |
| fprintf(fout, "MIN %g %g ", |
| part->partitionMin(), |
| part->partitionMax()); |
| if (part->hasMax()) |
| fprintf(fout, "MAX %g %g ", |
| part->partitionMin(), |
| part->partitionMax()); |
| fprintf(fout, "PINS "); |
| for (i = 0; i < part->numPins(); i++) |
| fprintf(fout, "%s ", part->pin(i)); |
| } else if (strcmp(itemT, "IO") == 0) { |
| if (dir == 'T') // toiopin |
| fprintf(fout, "+ TOIOPIN %s %s ", |
| part->instName(), |
| part->pinName()); |
| if (dir == 'F') // fromiopin |
| fprintf(fout, "+ FROMIOPIN %s %s ", |
| part->instName(), |
| part->pinName()); |
| } else if (strcmp(itemT, "COMP") == 0) { |
| if (dir == 'T') // tocomppin |
| fprintf(fout, "+ TOCOMPPIN %s %s ", |
| part->instName(), |
| part->pinName()); |
| if (dir == 'F') // fromcomppin |
| fprintf(fout, "+ FROMCOMPPIN %s %s ", |
| part->instName(), |
| part->pinName()); |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END PARTITIONS\n"); |
| break; |
| |
| case defrPinPropCbkType : |
| pprop = (defiPinProp*)cl; |
| if (pprop->isPin()) |
| fprintf(fout, "- PIN %s ", pprop->pinName()); |
| else |
| fprintf(fout, "- %s %s ", |
| pprop->instName(), |
| pprop->pinName()); |
| fprintf(fout, ";\n"); |
| if (pprop->numProps() > 0) { |
| for (i = 0; i < pprop->numProps(); i++) { |
| fprintf(fout, " + PROPERTY %s %s ", |
| pprop->propName(i), |
| pprop->propValue(i)); |
| switch (pprop->propType(i)) { |
| case 'R': fprintf(fout, "REAL "); |
| break; |
| case 'I': fprintf(fout, "INTEGER "); |
| break; |
| case 'S': fprintf(fout, "STRING "); |
| break; |
| case 'Q': fprintf(fout, "QUOTESTRING "); |
| break; |
| case 'N': fprintf(fout, "NUMBER "); |
| break; |
| } |
| } |
| fprintf(fout, ";\n"); |
| } |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END PINPROPERTIES\n"); |
| break; |
| case defrBlockageCbkType : |
| block = (defiBlockage*)cl; |
| if (testDebugPrint) { |
| block->print(fout); |
| } else { |
| if (block->hasLayer()) { |
| fprintf(fout, "- LAYER %s\n", block->layerName()); |
| if (block->hasComponent()) |
| fprintf(fout, " + COMPONENT %s\n", |
| block->layerComponentName()); |
| if (block->hasSlots()) |
| fprintf(fout, " + SLOTS\n"); |
| if (block->hasFills()) |
| fprintf(fout, " + FILLS\n"); |
| if (block->hasPushdown()) |
| fprintf(fout, " + PUSHDOWN\n"); |
| if (block->hasExceptpgnet()) |
| fprintf(fout, " + EXCEPTPGNET\n"); |
| if (block->hasMask()) |
| fprintf(fout, " + MASK %d\n", block->mask()); |
| if (block->hasSpacing()) |
| fprintf(fout, " + SPACING %d\n", |
| block->minSpacing()); |
| if (block->hasDesignRuleWidth()) |
| fprintf(fout, " + DESIGNRULEWIDTH %d\n", |
| block->designRuleWidth()); |
| } |
| else if (block->hasPlacement()) { |
| fprintf(fout, "- PLACEMENT\n"); |
| if (block->hasSoft()) |
| fprintf(fout, " + SOFT\n"); |
| if (block->hasPartial()) |
| fprintf(fout, " + PARTIAL %g\n", |
| block->placementMaxDensity()); |
| if (block->hasComponent()) |
| fprintf(fout, " + COMPONENT %s\n", |
| block->placementComponentName()); |
| if (block->hasPushdown()) |
| fprintf(fout, " + PUSHDOWN\n"); |
| } |
| |
| for (i = 0; i < block->numRectangles(); i++) { |
| fprintf(fout, " RECT %d %d %d %d\n", |
| block->xl(i), block->yl(i), |
| block->xh(i), block->yh(i)); |
| } |
| |
| for (i = 0; i < block->numPolygons(); i++) { |
| fprintf(fout, " POLYGON "); |
| points = block->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| fprintf(fout, "\n"); |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END BLOCKAGES\n"); |
| } |
| break; |
| case defrSlotCbkType : |
| slots = (defiSlot*)cl; |
| if (slots->hasLayer()) |
| fprintf(fout, "- LAYER %s\n", slots->layerName()); |
| |
| for (i = 0; i < slots->numRectangles(); i++) { |
| fprintf(fout, " RECT %d %d %d %d\n", |
| slots->xl(i), slots->yl(i), |
| slots->xh(i), slots->yh(i)); |
| } |
| for (i = 0; i < slots->numPolygons(); i++) { |
| fprintf(fout, " POLYGON "); |
| points = slots->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| fprintf(fout, ";\n"); |
| } |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END SLOTS\n"); |
| break; |
| case defrFillCbkType : |
| fills = (defiFill*)cl; |
| if (testDebugPrint) { |
| fills->print(fout); |
| } else { |
| if (fills->hasLayer()) { |
| fprintf(fout, "- LAYER %s", fills->layerName()); |
| if (fills->layerMask()) { |
| fprintf(fout, " + MASK %d", fills->layerMask()); |
| } |
| if (fills->hasLayerOpc()) |
| fprintf(fout, " + OPC"); |
| fprintf(fout, "\n"); |
| |
| for (i = 0; i < fills->numRectangles(); i++) { |
| fprintf(fout, " RECT %d %d %d %d\n", |
| fills->xl(i), fills->yl(i), |
| fills->xh(i), fills->yh(i)); |
| } |
| for (i = 0; i < fills->numPolygons(); i++) { |
| fprintf(fout, " POLYGON "); |
| points = fills->getPolygon(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| fprintf(fout, ";\n"); |
| } |
| fprintf(fout, ";\n"); |
| } |
| --numObjs; |
| if (fills->hasVia()) { |
| fprintf(fout, "- VIA %s", fills->viaName()); |
| if (fills->viaTopMask() || fills->viaCutMask() |
| || fills->viaBottomMask()) { |
| fprintf(fout, " + MASK %d%d%d", |
| fills->viaTopMask(), |
| fills->viaCutMask(), |
| fills->viaBottomMask()); |
| } |
| if (fills->hasViaOpc()) |
| fprintf(fout, " + OPC"); |
| fprintf(fout, "\n"); |
| |
| for (i = 0; i < fills->numViaPts(); i++) { |
| points = fills->getViaPts(i); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, " %d %d", points.x[j], points.y[j]); |
| fprintf(fout, ";\n"); |
| } |
| fprintf(fout, ";\n"); |
| } |
| if (numObjs <= 0) |
| fprintf(fout, "END FILLS\n"); |
| } |
| break; |
| case defrStylesCbkType : |
| struct defiPoints points; |
| styles = (defiStyles*)cl; |
| fprintf(fout, "- STYLE %d ", styles->style()); |
| points = styles->getPolygon(); |
| for (j = 0; j < points.numPoints; j++) |
| fprintf(fout, "%d %d ", points.x[j], points.y[j]); |
| fprintf(fout, ";\n"); |
| --numObjs; |
| if (numObjs <= 0) |
| fprintf(fout, "END STYLES\n"); |
| break; |
| |
| default: fprintf(fout, "BOGUS callback to cls.\n"); return 1; |
| } |
| return 0; |
| } |
| |
| |
| int dn(defrCallbackType_e c, const char* h, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "DIVIDERCHAR \"%s\" ;\n",h); |
| return 0; |
| } |
| |
| |
| int ext(defrCallbackType_e t, const char* c, defiUserData ud) { |
| char* name; |
| |
| checkType(t); |
| if (ud != userData) dataError(); |
| |
| switch (t) { |
| case defrNetExtCbkType : name = address("net"); break; |
| case defrComponentExtCbkType : name = address("component"); break; |
| case defrPinExtCbkType : name = address("pin"); break; |
| case defrViaExtCbkType : name = address("via"); break; |
| case defrNetConnectionExtCbkType : name = address("net connection"); break; |
| case defrGroupExtCbkType : name = address("group"); break; |
| case defrScanChainExtCbkType : name = address("scanchain"); break; |
| case defrIoTimingsExtCbkType : name = address("io timing"); break; |
| case defrPartitionsExtCbkType : name = address("partition"); break; |
| default: name = address("BOGUS"); return 1; |
| } |
| fprintf(fout, " %s extension %s\n", name, c); |
| return 0; |
| } |
| |
| int extension(defrCallbackType_e c, const char* extsn, defiUserData ud) { |
| checkType(c); |
| if (ud != userData) dataError(); |
| fprintf(fout, "BEGINEXT %s\n", extsn); |
| return 0; |
| } |
| |
| void* mallocCB(size_t size) { |
| return malloc(size); |
| } |
| |
| void* reallocCB(void* name, size_t size) { |
| return realloc(name, size); |
| } |
| |
| void freeCB(void* name) { |
| free(name); |
| return; |
| } |
| |
| |
| BEGIN_LEFDEF_PARSER_NAMESPACE |
| extern long long nlines; |
| END_LEFDEF_PARSER_NAMESPACE |
| static int ccr1131444 = 0; |
| |
| void lineNumberCB(long long lineNo) { |
| |
| // The CCR 1131444 tests ability of the DEF parser to count |
| // input line numbers out of 32-bit int range. On the first callback |
| // call 10G lines will be added to line counter. It should be |
| // reflected in output. |
| if (ccr1131444) { |
| lineNo += 10000000000LL; |
| defrSetNLines(lineNo); |
| ccr1131444 = 0; |
| } |
| |
| #ifdef _WIN32 |
| fprintf(fout, "Parsed %I64d number of lines!!\n", lineNo); |
| #else |
| fprintf(fout, "Parsed %lld number of lines!!\n", lineNo); |
| #endif |
| } |
| |
| int unUsedCB(defrCallbackType_e, void*, defiUserData) { |
| fprintf(fout, "This callback is not used.\n"); |
| return 0; |
| } |
| |
| void printWarning(const char *str) |
| { |
| fprintf(stderr, "%s\n", str); |
| } |
| |
| int main(int argc, char** argv) { |
| int num = 99; |
| char* inFile[6]; |
| char* outFile; |
| FILE* f; |
| int res; |
| int noCalls = 0; |
| // long start_mem; |
| int retStr = 0; |
| int numInFile = 0; |
| int fileCt = 0; |
| int test1 = 0; |
| int test2 = 0; |
| int noNetCb = 0; |
| int ccr749853 = 0; |
| int line_num_print_interval = 50; |
| |
| #ifdef WIN32 |
| // Enable two-digit exponent format |
| _set_output_format(_TWO_DIGIT_EXPONENT); |
| #endif |
| |
| // start_mem = (long)sbrk(0); |
| |
| strcpy(defaultName, "def.in"); |
| strcpy(defaultOut, "list"); |
| inFile[0] = defaultName; |
| outFile = defaultOut; |
| fout = stdout; |
| userData = (void*) 0x01020304; |
| argc--; |
| argv++; |
| |
| if (argc == 0) { |
| fprintf(stderr, "Type 'defrw --help' for the help.\n"); |
| return 2; |
| } |
| |
| while (argc--) { |
| if (strcmp(*argv, "-d") == 0) { |
| argv++; |
| argc--; |
| sscanf(*argv, "%d", &num); |
| defiSetDebug(num, 1); |
| } else if (strcmp(*argv, "-nc") == 0) { |
| noCalls = 1; |
| } else if (strcmp(*argv, "-o") == 0) { |
| argv++; |
| argc--; |
| outFile = *argv; |
| if ((fout = fopen(outFile, "w")) == 0) { |
| fprintf(stderr, "ERROR: could not open output file\n"); |
| return 2; |
| } |
| } else if (strcmp(*argv, "-verStr") == 0) { |
| /* New to set the version callback routine to return a string */ |
| /* instead of double. */ |
| retStr = 1; |
| } else if (strcmp(*argv, "-i") == 0) { |
| argv++; |
| argc--; |
| line_num_print_interval = atoi(*argv); |
| } else if (strcmp(*argv, "-test1") == 0) { |
| test1 = 1; |
| } else if (strcmp(*argv, "-test2") == 0) { |
| test2 = 1; |
| } else if (strcmp(*argv, "-noNet") == 0) { |
| noNetCb = 1; |
| } else if (strcmp(*argv, "-ccr749853") == 0) { |
| ccr749853 = 1; |
| } else if (strcmp(*argv, "-ccr1131444") == 0) { |
| ccr1131444 = 1; |
| } else if (strcmp(*argv, "-testDebugPrint") == 0) { |
| testDebugPrint = 1; |
| } else if (strcmp(*argv, "-sessionless") == 0) { |
| isSessionless = 1; |
| } else if (strcmp(*argv, "-ignoreRowNames") == 0) { |
| ignoreRowNames = 1; |
| } else if (strcmp(*argv, "-ignoreViaNames") == 0) { |
| ignoreViaNames = 1; |
| } else if (argv[0][0] != '-') { |
| if (numInFile >= 6) { |
| fprintf(stderr, "ERROR: too many input files, max = 6.\n"); |
| return 2; |
| } |
| inFile[numInFile++] = *argv; |
| } else if ((strcmp(*argv, "-h") == 0) || (strcmp(*argv, "--help") == 0)) { |
| fprintf(stderr, "Usage: defrw (<option>|<file>)* \n"); |
| fprintf(stderr, "Files:\n"); |
| fprintf(stderr, "\tupto 6 DEF files many be supplied.\n"); |
| fprintf(stderr, "\tif <defFileName> is set to 'STDIN' - takes data from stdin.\n"); |
| fprintf(stderr, "Options:\n"); |
| fprintf(stderr, "\t-i <num_lines> -- sets processing msg interval (default: 50 lines).\n"); |
| fprintf(stderr, "\t-nc -- no functional callbacks will be called.\n"); |
| fprintf(stderr, "\t-o <out_file> -- write output to the file.\n"); |
| fprintf(stderr, "\t-ignoreRowNames -- don't output row names.\n"); |
| fprintf(stderr, "\t-ignoreViaNames -- don't output via names.\n"); |
| return 2; |
| } else if (strcmp(*argv, "-setSNetWireCbk") == 0) { |
| setSNetWireCbk = 1; |
| } else { |
| fprintf(stderr, "ERROR: Illegal command line option: '%s'\n", *argv); |
| return 2; |
| } |
| |
| argv++; |
| } |
| |
| //defrSetLogFunction(myLogFunction); |
| //defrSetWarningLogFunction(myWarningLogFunction); |
| |
| if (isSessionless) { |
| defrInitSession(0); |
| defrSetLongLineNumberFunction(lineNumberCB); |
| defrSetDeltaNumberLines(line_num_print_interval); |
| } |
| |
| defrInitSession(isSessionless ? 0 : 1); |
| |
| if (noCalls == 0) { |
| |
| defrSetWarningLogFunction(printWarning); |
| |
| |
| defrSetUserData((void*)3); |
| defrSetDesignCbk(dname); |
| defrSetTechnologyCbk(tname); |
| defrSetExtensionCbk(extension); |
| defrSetDesignEndCbk(done); |
| defrSetPropDefStartCbk(propstart); |
| defrSetPropCbk(prop); |
| defrSetPropDefEndCbk(propend); |
| /* Test for CCR 766289*/ |
| if (!noNetCb) |
| defrSetNetCbk(netf); |
| defrSetNetNameCbk(netNamef); |
| defrSetNetNonDefaultRuleCbk(nondefRulef); |
| defrSetNetSubnetNameCbk(subnetNamef); |
| defrSetNetPartialPathCbk(netpath); |
| defrSetSNetCbk(snetf); |
| defrSetSNetPartialPathCbk(snetpath); |
| if (setSNetWireCbk) |
| defrSetSNetWireCbk(snetwire); |
| defrSetComponentMaskShiftLayerCbk(compMSL); |
| defrSetComponentCbk(compf); |
| defrSetAddPathToNet(); |
| defrSetHistoryCbk(hist); |
| defrSetConstraintCbk(constraint); |
| defrSetAssertionCbk(constraint); |
| defrSetArrayNameCbk(an); |
| defrSetFloorPlanNameCbk(fn); |
| defrSetDividerCbk(dn); |
| defrSetBusBitCbk(bbn); |
| defrSetNonDefaultCbk(ndr); |
| |
| defrSetAssertionsStartCbk(constraintst); |
| defrSetConstraintsStartCbk(constraintst); |
| defrSetComponentStartCbk(cs); |
| defrSetPinPropStartCbk(cs); |
| defrSetNetStartCbk(cs); |
| defrSetStartPinsCbk(cs); |
| defrSetViaStartCbk(cs); |
| defrSetRegionStartCbk(cs); |
| defrSetSNetStartCbk(cs); |
| defrSetGroupsStartCbk(cs); |
| defrSetScanchainsStartCbk(cs); |
| defrSetIOTimingsStartCbk(cs); |
| defrSetFPCStartCbk(cs); |
| defrSetTimingDisablesStartCbk(cs); |
| defrSetPartitionsStartCbk(cs); |
| defrSetBlockageStartCbk(cs); |
| defrSetSlotStartCbk(cs); |
| defrSetFillStartCbk(cs); |
| defrSetNonDefaultStartCbk(cs); |
| defrSetStylesStartCbk(cs); |
| |
| // All of the extensions point to the same function. |
| defrSetNetExtCbk(ext); |
| defrSetComponentExtCbk(ext); |
| defrSetPinExtCbk(ext); |
| defrSetViaExtCbk(ext); |
| defrSetNetConnectionExtCbk(ext); |
| defrSetGroupExtCbk(ext); |
| defrSetScanChainExtCbk(ext); |
| defrSetIoTimingsExtCbk(ext); |
| defrSetPartitionsExtCbk(ext); |
| |
| defrSetUnitsCbk(units); |
| if (!retStr) |
| defrSetVersionCbk(vers); |
| else |
| defrSetVersionStrCbk(versStr); |
| defrSetCaseSensitiveCbk(casesens); |
| |
| // The following calls are an example of using one function "cls" |
| // to be the callback for many DIFFERENT types of constructs. |
| // We have to cast the function type to meet the requirements |
| // of each different set function. |
| defrSetSiteCbk((defrSiteCbkFnType)cls); |
| defrSetCanplaceCbk((defrSiteCbkFnType)cls); |
| defrSetCannotOccupyCbk((defrSiteCbkFnType)cls); |
| defrSetDieAreaCbk((defrBoxCbkFnType)cls); |
| defrSetPinCapCbk((defrPinCapCbkFnType)cls); |
| defrSetPinCbk((defrPinCbkFnType)cls); |
| defrSetPinPropCbk((defrPinPropCbkFnType)cls); |
| defrSetDefaultCapCbk((defrIntegerCbkFnType)cls); |
| defrSetRowCbk((defrRowCbkFnType)cls); |
| defrSetTrackCbk((defrTrackCbkFnType)cls); |
| defrSetGcellGridCbk((defrGcellGridCbkFnType)cls); |
| defrSetViaCbk((defrViaCbkFnType)cls); |
| defrSetRegionCbk((defrRegionCbkFnType)cls); |
| defrSetGroupNameCbk((defrStringCbkFnType)cls); |
| defrSetGroupMemberCbk((defrStringCbkFnType)cls); |
| defrSetGroupCbk((defrGroupCbkFnType)cls); |
| defrSetScanchainCbk((defrScanchainCbkFnType)cls); |
| defrSetIOTimingCbk((defrIOTimingCbkFnType)cls); |
| defrSetFPCCbk((defrFPCCbkFnType)cls); |
| defrSetTimingDisableCbk((defrTimingDisableCbkFnType)cls); |
| defrSetPartitionCbk((defrPartitionCbkFnType)cls); |
| defrSetBlockageCbk((defrBlockageCbkFnType)cls); |
| defrSetSlotCbk((defrSlotCbkFnType)cls); |
| defrSetFillCbk((defrFillCbkFnType)cls); |
| defrSetStylesCbk((defrStylesCbkFnType)cls); |
| |
| defrSetAssertionsEndCbk(endfunc); |
| defrSetComponentEndCbk(endfunc); |
| defrSetConstraintsEndCbk(endfunc); |
| defrSetNetEndCbk(endfunc); |
| defrSetFPCEndCbk(endfunc); |
| defrSetFPCEndCbk(endfunc); |
| defrSetGroupsEndCbk(endfunc); |
| defrSetIOTimingsEndCbk(endfunc); |
| defrSetNetEndCbk(endfunc); |
| defrSetPartitionsEndCbk(endfunc); |
| defrSetRegionEndCbk(endfunc); |
| defrSetSNetEndCbk(endfunc); |
| defrSetScanchainsEndCbk(endfunc); |
| defrSetPinEndCbk(endfunc); |
| defrSetTimingDisablesEndCbk(endfunc); |
| defrSetViaEndCbk(endfunc); |
| defrSetPinPropEndCbk(endfunc); |
| defrSetBlockageEndCbk(endfunc); |
| defrSetSlotEndCbk(endfunc); |
| defrSetFillEndCbk(endfunc); |
| defrSetNonDefaultEndCbk(endfunc); |
| defrSetStylesEndCbk(endfunc); |
| |
| defrSetMallocFunction(mallocCB); |
| defrSetReallocFunction(reallocCB); |
| defrSetFreeFunction(freeCB); |
| |
| //defrSetRegisterUnusedCallbacks(); |
| |
| // Testing to set the number of warnings |
| defrSetAssertionWarnings(3); |
| defrSetBlockageWarnings(3); |
| defrSetCaseSensitiveWarnings(3); |
| defrSetComponentWarnings(3); |
| defrSetConstraintWarnings(0); |
| defrSetDefaultCapWarnings(3); |
| defrSetGcellGridWarnings(3); |
| defrSetIOTimingWarnings(3); |
| defrSetNetWarnings(3); |
| defrSetNonDefaultWarnings(3); |
| defrSetPinExtWarnings(3); |
| defrSetPinWarnings(3); |
| defrSetRegionWarnings(3); |
| defrSetRowWarnings(3); |
| defrSetScanchainWarnings(3); |
| defrSetSNetWarnings(3); |
| defrSetStylesWarnings(3); |
| defrSetTrackWarnings(3); |
| defrSetUnitsWarnings(3); |
| defrSetVersionWarnings(3); |
| defrSetViaWarnings(3); |
| } |
| |
| if (! isSessionless) { |
| defrSetLongLineNumberFunction(lineNumberCB); |
| defrSetDeltaNumberLines(line_num_print_interval); |
| } |
| |
| (void) defrSetOpenLogFileAppend(); |
| |
| if (ccr749853) { |
| defrSetTotalMsgLimit (5); |
| defrSetLimitPerMsg (6008, 2); |
| |
| } |
| |
| if (test1) { // for special tests |
| for (fileCt = 0; fileCt < numInFile; fileCt++) { |
| if ((f = fopen(inFile[fileCt],"r")) == 0) { |
| fprintf(stderr,"Couldn't open input file '%s'\n", inFile[fileCt]); |
| return(2); |
| } |
| // Set case sensitive to 0 to start with, in History & PropertyDefinition |
| // reset it to 1. |
| res = defrRead(f, inFile[fileCt], userData, 1); |
| |
| if (res) |
| fprintf(stderr, "Reader returns bad status.\n", inFile[fileCt]); |
| |
| (void)defrPrintUnusedCallbacks(fout); |
| (void)defrReleaseNResetMemory(); |
| (void)defrUnsetNonDefaultCbk(); |
| (void)defrUnsetNonDefaultStartCbk(); |
| (void)defrUnsetNonDefaultEndCbk(); |
| } |
| } |
| else if (test2) { // for special tests |
| // this test is design to test the 3 APIs, defrDisableParserMsgs, |
| // defrEnableParserMsgs & defrEnableAllMsgs |
| // It uses the file ccr523879.def. This file will parser 3 times |
| // 1st it will have defrDisableParserMsgs set to both 7010 & 7016 |
| // 2nd will enable 7016 by calling defrEnableParserMsgs |
| // 3rd enable all msgs by call defrEnableAllMsgs |
| |
| int nMsgs = 2; |
| int dMsgs[2]; |
| |
| for (fileCt = 0; fileCt < numInFile; fileCt++) { |
| if (fileCt == 0) { |
| dMsgs[0] = 7010; |
| dMsgs[1] = 7016; |
| defrDisableParserMsgs (2, (int*)dMsgs); |
| } else if (fileCt == 1) { |
| dMsgs[0] = 7016; |
| defrEnableParserMsgs (1, (int*)dMsgs); |
| } else |
| defrEnableAllMsgs(); |
| |
| if ((f = fopen(inFile[fileCt],"r")) == 0) { |
| fprintf(stderr,"Couldn't open input file '%s'\n", inFile[fileCt]); |
| return(2); |
| } |
| |
| res = defrRead(f, inFile[fileCt], userData, 1); |
| |
| if (res) |
| fprintf(stderr, "Reader returns bad status.\n", inFile[fileCt]); |
| |
| (void)defrPrintUnusedCallbacks(fout); |
| (void)defrReleaseNResetMemory(); |
| (void)defrUnsetNonDefaultCbk(); |
| (void)defrUnsetNonDefaultStartCbk(); |
| (void)defrUnsetNonDefaultEndCbk(); |
| } |
| } else { |
| for (fileCt = 0; fileCt < numInFile; fileCt++) { |
| if (strcmp(inFile[fileCt], "STDIN") == 0) { |
| f = stdin; |
| } else if ((f = fopen(inFile[fileCt],"r")) == 0) { |
| fprintf(stderr,"Couldn't open input file '%s'\n", inFile[fileCt]); |
| return(2); |
| } |
| // Set case sensitive to 0 to start with, in History & PropertyDefinition |
| // reset it to 1. |
| |
| res = defrRead(f, inFile[fileCt], userData, 1); |
| |
| if (res) |
| fprintf(stderr, "Reader returns bad status.\n", inFile[fileCt]); |
| |
| // Testing the aliases API. |
| defrAddAlias ("alias1", "aliasValue1", 1); |
| |
| defiAlias_itr aliasStore; |
| const char *alias1Value = NULL; |
| |
| while (aliasStore.Next()) { |
| if (strcmp(aliasStore.Key(), "alias1") == 0) { |
| alias1Value = aliasStore.Data(); |
| } |
| } |
| |
| if (!alias1Value || strcmp(alias1Value, "aliasValue1")) { |
| fprintf(stderr, "ERROR: Aliases don't work\n"); |
| } |
| |
| (void)defrPrintUnusedCallbacks(fout); |
| (void)defrReleaseNResetMemory(); |
| } |
| (void)defrUnsetCallbacks(); |
| (void)defrSetUnusedCallbacks(unUsedCB); |
| } |
| |
| // Unset all the callbacks |
| defrUnsetArrayNameCbk (); |
| defrUnsetAssertionCbk (); |
| defrUnsetAssertionsStartCbk (); |
| defrUnsetAssertionsEndCbk (); |
| defrUnsetBlockageCbk (); |
| defrUnsetBlockageStartCbk (); |
| defrUnsetBlockageEndCbk (); |
| defrUnsetBusBitCbk (); |
| defrUnsetCannotOccupyCbk (); |
| defrUnsetCanplaceCbk (); |
| defrUnsetCaseSensitiveCbk (); |
| defrUnsetComponentCbk (); |
| defrUnsetComponentExtCbk (); |
| defrUnsetComponentStartCbk (); |
| defrUnsetComponentEndCbk (); |
| defrUnsetConstraintCbk (); |
| defrUnsetConstraintsStartCbk (); |
| defrUnsetConstraintsEndCbk (); |
| defrUnsetDefaultCapCbk (); |
| defrUnsetDesignCbk (); |
| defrUnsetDesignEndCbk (); |
| defrUnsetDieAreaCbk (); |
| defrUnsetDividerCbk (); |
| defrUnsetExtensionCbk (); |
| defrUnsetFillCbk (); |
| defrUnsetFillStartCbk (); |
| defrUnsetFillEndCbk (); |
| defrUnsetFPCCbk (); |
| defrUnsetFPCStartCbk (); |
| defrUnsetFPCEndCbk (); |
| defrUnsetFloorPlanNameCbk (); |
| defrUnsetGcellGridCbk (); |
| defrUnsetGroupCbk (); |
| defrUnsetGroupExtCbk (); |
| defrUnsetGroupMemberCbk (); |
| defrUnsetComponentMaskShiftLayerCbk (); |
| defrUnsetGroupNameCbk (); |
| defrUnsetGroupsStartCbk (); |
| defrUnsetGroupsEndCbk (); |
| defrUnsetHistoryCbk (); |
| defrUnsetIOTimingCbk (); |
| defrUnsetIOTimingsStartCbk (); |
| defrUnsetIOTimingsEndCbk (); |
| defrUnsetIOTimingsExtCbk (); |
| defrUnsetNetCbk (); |
| defrUnsetNetNameCbk (); |
| defrUnsetNetNonDefaultRuleCbk (); |
| defrUnsetNetConnectionExtCbk (); |
| defrUnsetNetExtCbk (); |
| defrUnsetNetPartialPathCbk (); |
| defrUnsetNetSubnetNameCbk (); |
| defrUnsetNetStartCbk (); |
| defrUnsetNetEndCbk (); |
| defrUnsetNonDefaultCbk (); |
| defrUnsetNonDefaultStartCbk (); |
| defrUnsetNonDefaultEndCbk (); |
| defrUnsetPartitionCbk (); |
| defrUnsetPartitionsExtCbk (); |
| defrUnsetPartitionsStartCbk (); |
| defrUnsetPartitionsEndCbk (); |
| defrUnsetPathCbk (); |
| defrUnsetPinCapCbk (); |
| defrUnsetPinCbk (); |
| defrUnsetPinEndCbk (); |
| defrUnsetPinExtCbk (); |
| defrUnsetPinPropCbk (); |
| defrUnsetPinPropStartCbk (); |
| defrUnsetPinPropEndCbk (); |
| defrUnsetPropCbk (); |
| defrUnsetPropDefEndCbk (); |
| defrUnsetPropDefStartCbk (); |
| defrUnsetRegionCbk (); |
| defrUnsetRegionStartCbk (); |
| defrUnsetRegionEndCbk (); |
| defrUnsetRowCbk (); |
| defrUnsetScanChainExtCbk (); |
| defrUnsetScanchainCbk (); |
| defrUnsetScanchainsStartCbk (); |
| defrUnsetScanchainsEndCbk (); |
| defrUnsetSiteCbk (); |
| defrUnsetSlotCbk (); |
| defrUnsetSlotStartCbk (); |
| defrUnsetSlotEndCbk (); |
| defrUnsetSNetWireCbk (); |
| defrUnsetSNetCbk (); |
| defrUnsetSNetStartCbk (); |
| defrUnsetSNetEndCbk (); |
| defrUnsetSNetPartialPathCbk (); |
| defrUnsetStartPinsCbk (); |
| defrUnsetStylesCbk (); |
| defrUnsetStylesStartCbk (); |
| defrUnsetStylesEndCbk (); |
| defrUnsetTechnologyCbk (); |
| defrUnsetTimingDisableCbk (); |
| defrUnsetTimingDisablesStartCbk (); |
| defrUnsetTimingDisablesEndCbk (); |
| defrUnsetTrackCbk (); |
| defrUnsetUnitsCbk (); |
| defrUnsetVersionCbk (); |
| defrUnsetVersionStrCbk (); |
| defrUnsetViaCbk (); |
| defrUnsetViaExtCbk (); |
| defrUnsetViaStartCbk (); |
| defrUnsetViaEndCbk (); |
| |
| fclose(fout); |
| |
| // Release allocated singleton data. |
| defrClear(); |
| |
| return res; |
| } |
| |