diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | base/flatten.c | 2 | ||||
-rw-r--r-- | base/netcmp.c | 589 | ||||
-rw-r--r-- | base/netcmp.h | 6 | ||||
-rw-r--r-- | base/netfile.c | 150 | ||||
-rw-r--r-- | base/netfile.h | 1 | ||||
-rw-r--r-- | base/netgen.c | 184 | ||||
-rw-r--r-- | base/netgen.h | 6 | ||||
-rw-r--r-- | base/objlist.h | 26 | ||||
-rw-r--r-- | base/verilog.c | 615 | ||||
-rw-r--r-- | doc/Makefile | 4 | ||||
-rwxr-xr-x | scripts/configure | 6 | ||||
-rw-r--r-- | scripts/configure.in | 6 | ||||
-rw-r--r-- | tcltk/netgen.tcl.in | 4 | ||||
-rw-r--r-- | tcltk/tclnetgen.c | 219 | ||||
-rw-r--r-- | tcltk/tmp.out | 4405 |
17 files changed, 5737 insertions, 492 deletions
@@ -60,11 +60,11 @@ install-real: install-dirs (cd $$dir && ${MAKE} install); done install-tcl-dirs: - ${NETGENDIR}/scripts/mkdirs $(DESTDIR)${BINDIR} $(DESTDIR)${MANDIR} \ + ${NETGENDIR}/scripts/mkdirs $(DESTDIR)${BINDIR} \ $(DESTDIR)${TCLDIR} $(DESTDIR)${PYDIR} install-dirs: - ${NETGENDIR}/scripts/mkdirs $(DESTDIR)${BINDIR} $(DESTDIR)${MANDIR} + ${NETGENDIR}/scripts/mkdirs $(DESTDIR)${BINDIR} install-tcl: install-dirs @echo --- installing executable to $(DESTDIR)${BINDIR} @@ -1 +1 @@ -1.5.107 +1.5.116 diff --git a/base/flatten.c b/base/flatten.c index 83c9fea..2aedcf2 100644 --- a/base/flatten.c +++ b/base/flatten.c @@ -1391,7 +1391,7 @@ SurveyCell(struct nlist *tc, struct hashdict *compdict, int file1, int file2, in /* */ /* If there is a mismatch between instances of low- */ /* level devices, determine if the mismatches can be */ -/* resolved by parallel/serial combining, according to */ +/* resolved by parallel/series combining, according to */ /* combination rules. */ /* */ /* Return the number of modifications made. */ diff --git a/base/netcmp.c b/base/netcmp.c index 3d69fe6..69dc11b 100644 --- a/base/netcmp.c +++ b/base/netcmp.c @@ -500,7 +500,7 @@ void SummarizeDataStructures(void) if (E->graph == Circuit1->file) cell1++; else cell2++; } - Printf("Circuit 1 contains %d elements, Circuit 2 contains %d elements.", + Printf("Circuit 1 contains %d devices, Circuit 2 contains %d devices.", cell1, cell2); if (cell1 != cell2) Printf(" *** MISMATCH ***"); Printf("\n"); @@ -518,12 +518,12 @@ void SummarizeDataStructures(void) if (N->elementlist == NULL) orphan2++; } } - Printf("Circuit 1 contains %d nodes, Circuit 2 contains %d nodes.", + Printf("Circuit 1 contains %d nets, Circuit 2 contains %d nets.", cell1, cell2); if (cell1 != cell2) Printf(" *** MISMATCH ***"); Printf("\n"); if (orphan1 || orphan2) { - Printf("Circuit 1 contains %d orphan nodes, Circuit 2 contains %d orphans."); + Printf("Circuit 1 contains %d orphan nets, Circuit 2 contains %d orphans."); if (orphan1 != orphan2) Printf(" *** MISMATCH ***"); Printf("\n"); } @@ -2076,7 +2076,7 @@ struct Node *CreateNodeList(char *name, short graph) * in sequence to link up 'subelement' field of ElementList, * then 'node' field of NodeList structures. * - * Return the number of devices combined by serial/parallel merging + * Return the number of devices combined by series/parallel merging */ int CreateLists(char *name, short graph) @@ -2102,7 +2102,7 @@ int CreateLists(char *name, short graph) return 0; } - /* Parallel and serial combinations. Run until networks of */ + /* Parallel and series combinations. Run until networks of */ /* devices are resolved into a single device with the network */ /* represented by a number of property records. */ @@ -2112,19 +2112,21 @@ int CreateLists(char *name, short graph) total += pcnt; if (ppass > 0 && pcnt == 0) break; for (spass = 0; ; spass++) { - scnt = CombineSerial(name, graph); + scnt = CombineSeries(name, graph); total += scnt; if (scnt == 0) break; } if (spass == 0) break; } + /* Uncomment this for series/parallel network diagnostics */ + /* DumpNetworkAll(name, graph); */ Elements = CreateElementList(name, graph); Nodes = CreateNodeList(name, graph); if (LookupElementList == NULL) return total; ElementScan = NULL; - NListScan = NULL; /* just to stop the compiler from bitching */ + NListScan = NULL; for (ob = tp->cell; ob != NULL; ob = ob->next) { if (ob->type == FIRSTPIN) { if (ElementScan == NULL) ElementScan = Elements; @@ -2221,7 +2223,7 @@ struct Node *CreateNodeList(char *name, short graph) * in sequence to link up 'subelement' field of ElementList, * then 'node' field of NodeList structures. * - * Return the number of devices combined by serial/parallel merging + * Return the number of devices combined by series/parallel merging */ int CreateLists(char *name, short graph) @@ -2250,7 +2252,7 @@ int CreateLists(char *name, short graph) ConnectAllNodes(name, graph); - /* Parallel and serial combinations. Run until networks of */ + /* Parallel and series combinations. Run until networks of */ /* devices are resolved into a single device with the network */ /* represented by a number of property records. */ @@ -2260,12 +2262,14 @@ int CreateLists(char *name, short graph) total += pcnt; if (ppass > 0 && pcnt == 0) break; for (spass = 0; ; spass++) { - scnt = CombineSerial(name, graph); + scnt = CombineSeries(name, graph); total += scnt; if (scnt == 0) break; } if (spass == 0) break; } + /* Uncomment this for series/parallel network diagnostics */ + /* DumpNetworkAll(name, graph); */ E = CreateElementList(name, graph); N = CreateNodeList(name, graph); @@ -3464,7 +3468,7 @@ void CreateTwoLists(char *name1, int file1, char *name2, int file2, int dolist) } if (modified > 0) { - Printf("Circuit was modified by parallel/serial device merging.\n"); + Printf("Circuit was modified by parallel/series device merging.\n"); Printf("New circuit summary:\n\n"); /* print preliminary statistics */ Printf("Contents of circuit 1: "); @@ -3685,18 +3689,19 @@ int Iterate(void) /*--------------------------------------------------------------*/ /* Combine properties of ob1 starting at property idx1 up to */ -/* property (idx1 + run1), where devices match critical serial */ +/* property (idx1 + run1), where devices match critical series */ /* values and can be combined by summing over the "S" record. */ /*--------------------------------------------------------------*/ -int serial_optimize(struct objlist *ob1, struct nlist *tp1, int idx1, int run1) +int series_optimize(struct objlist *ob1, struct nlist *tp1, int idx1, + int run1, int comb) { struct objlist *obn; int i; obn = ob1; for (i = 0; i < idx1; i++) obn = obn->next; - return PropertyOptimize(obn, tp1, run1, TRUE); + return PropertyOptimize(obn, tp1, run1, TRUE, comb); } /*--------------------------------------------------------------*/ @@ -3705,7 +3710,7 @@ int serial_optimize(struct objlist *ob1, struct nlist *tp1, int idx1, int run1) /* idx2 to (idx2 + run2). run1 is always larger than run2. */ /*--------------------------------------------------------------*/ -int serial_combine(struct objlist *ob1, struct nlist *tp1, int idx1, int run1, +int series_combine(struct objlist *ob1, struct nlist *tp1, int idx1, int run1, struct objlist *ob2, struct nlist *tp2, int idx2, int run2) { struct objlist *obn, *obp; @@ -3717,11 +3722,6 @@ int serial_combine(struct objlist *ob1, struct nlist *tp1, int idx1, int run1, obp = ob2; for (i = 0; i < idx2; i++) obp = obp->next; - // for (j = 0; j < run2; j++) { - // for (i = 0; i < run1; i++) { - // } - // } - return changed; } @@ -3747,18 +3747,18 @@ static int compsort(const void *p1, const void *p2) /*--------------------------------------------------------------*/ /* Sort properties of ob1 starting at property idx1 up to */ -/* property (idx1 + run). Use serial critical property for */ +/* property (idx1 + run). Use series critical property for */ /* sorting. Multiply critical property by S before sort. */ /* ob1 is the record before the first property. */ /*--------------------------------------------------------------*/ -void serial_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) +void series_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) { struct objlist *obn, *obp; propsort *proplist; struct property *kl; - struct valuelist *vl; - int i, p, sval; + struct valuelist *vl, *sl; + int i, p, sval, merge_type; double cval; obn = ob1->next; @@ -3774,22 +3774,34 @@ void serial_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) sval = 1; cval = 0.0; for (i = 0; i < run; i++) { + merge_type = MERGE_NONE; for (p = 0;; p++) { vl = &(obp->instance.props[p]); if (vl->type == PROP_ENDLIST) break; if (vl->key == NULL) continue; - if (!strcmp(vl->key, "S")) + if (!strcmp(vl->key, "S")) { sval = vl->value.ival; + sl = vl; + } else { kl = (struct property *)HashLookup(vl->key, &(tp1->propdict)); - if (kl && (kl->merge == MERGE_SER_CRIT)) + if (kl && (kl->merge & MERGE_S_CRIT)) { if (vl->type == PROP_INTEGER) cval = (double)vl->value.ival; else cval = vl->value.dval; + merge_type = kl->merge & (MERGE_S_ADD | MERGE_S_PAR); + } } } - proplist[i].value = (double)sval * cval; + if (merge_type == MERGE_S_ADD) { + proplist[i].value = cval * (double)sval; + sl->value.ival = 1; + } + else if (merge_type == MERGE_S_PAR) { + proplist[i].value = cval / (double)sval; + sl->value.ival = 1; + } proplist[i].idx = i; proplist[i].ob = obp; obp = obp->next; @@ -3816,14 +3828,15 @@ void serial_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) /* record. */ /*--------------------------------------------------------------*/ -int parallel_optimize(struct objlist *ob1, struct nlist *tp1, int idx1, int run1) +int parallel_optimize(struct objlist *ob1, struct nlist *tp1, int idx1, + int run1, int comb) { struct objlist *obn; int i; obn = ob1; for (i = 0; i < idx1; i++) obn = obn->next; - return PropertyOptimize(obn, tp1, run1, FALSE); + return PropertyOptimize(obn, tp1, run1, FALSE, comb); } /*--------------------------------------------------------------*/ @@ -3844,11 +3857,6 @@ int parallel_combine(struct objlist *ob1, struct nlist *tp1, int idx1, int run1, obp = ob2; for (i = 0; i < idx2; i++) obp = obp->next; - // for (j = 0; j < run2; j++) { - // for (i = 0; i < run1; i++) { - // } - // } - return changed; } @@ -3864,8 +3872,9 @@ void parallel_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) struct objlist *obn, *obp; propsort *proplist; struct property *kl; - struct valuelist *vl; - int i, p, sval; + struct valuelist *vl, *ml; + int i, p, mval, merge_type, has_crit = FALSE; + char *subs_crit = NULL; double cval; obn = ob1->next; @@ -3875,31 +3884,106 @@ void parallel_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) // value and index. Then sort that list, then use the sorted // indexes to sort the actual property linked list. + // If there is no critical property listed, then it is still better + // to sort on any random property than on no properties. Note that + // this can (and should!) be made better by sorting on *all* + // properties, not just the first. Otherwise, circuit 1 can have, e.g., + // parallel transistors with W=1, L=1 and W=1, L=2 while circuit two + // has W=1, L=2 and W=1, L=1 and property matching will fail because + // sorting was done on W only. + proplist = (propsort *)MALLOC(run * sizeof(propsort)); obp = obn; - sval = 1; + mval = 1; cval = 0.0; for (i = 0; i < run; i++) { + merge_type = MERGE_NONE; for (p = 0;; p++) { vl = &(obp->instance.props[p]); if (vl->type == PROP_ENDLIST) break; if (vl->key == NULL) continue; - if (!strcmp(vl->key, "S")) - sval = vl->value.ival; + if (!strcmp(vl->key, "M")) { + mval = vl->value.ival; + ml = vl; + } kl = (struct property *)HashLookup(vl->key, &(tp1->propdict)); if (kl == NULL) continue; /* Ignored property */ - if (kl->merge == MERGE_ADD_CRIT) + if (kl->merge & MERGE_P_CRIT) { + has_crit = TRUE; + if ((vl->type == PROP_STRING || vl->type == PROP_EXPRESSION) && + (kl->type != vl->type)) + PromoteProperty(kl, vl); if (vl->type == PROP_INTEGER) cval = (double)vl->value.ival; + else if (vl->type == PROP_STRING) + /* This is unlikely---no method to merge string properties! */ + cval = (double)vl->value.string[0] + + (double)vl->value.string[1] / 10.0; else cval = vl->value.dval; + merge_type = kl->merge & (MERGE_P_ADD | MERGE_P_PAR); + } + } + if (merge_type == MERGE_P_ADD) { + proplist[i].value = cval * (double)mval; + ml->value.ival = 1; + } + else if (merge_type == MERGE_P_PAR) { + proplist[i].value = cval / (double)mval; + ml->value.ival = 1; } - proplist[i].value = (double)sval * cval; proplist[i].idx = i; proplist[i].ob = obp; obp = obp->next; } + + if (has_crit == FALSE) { + /* If no critical property was specified, then choose the first one found */ + /* and recalculate all the proplist values. */ + mval = 1; + obp = obn; + merge_type = MERGE_NONE; + for (i = 0; i < run; i++) { + for (p = 0;; p++) { + vl = &(obp->instance.props[p]); + if (vl->type == PROP_ENDLIST) break; + if (vl->key == NULL) continue; + if (!strcmp(vl->key, "M")) { + mval = vl->value.ival; + ml = vl; + } + kl = (struct property *)HashLookup(vl->key, &(tp1->propdict)); + if (kl == NULL) continue; /* Ignored property */ + if (subs_crit == NULL) + subs_crit = vl->key; + if ((subs_crit != NULL) && !strcmp(vl->key, subs_crit)) { + if ((vl->type == PROP_STRING || vl->type == PROP_EXPRESSION) && + (kl->type != vl->type)) + PromoteProperty(kl, vl); + if (vl->type == PROP_INTEGER) + cval = (double)vl->value.ival; + else if (vl->type == PROP_STRING) + /* In case property is non-numeric, sort by dictionary order */ + cval = (double)vl->value.string[0] + + (double)vl->value.string[1] / 10.0; + else + cval = vl->value.dval; + merge_type = kl->merge & (MERGE_P_ADD | MERGE_P_PAR); + } + } + if (merge_type == MERGE_P_ADD) { + proplist[i].value = cval * (double)mval; + ml->value.ival = 1; + } + else if (merge_type == MERGE_P_PAR) { + proplist[i].value = cval / (double)mval; + ml->value.ival = 1; + } + obp = obp->next; + } + } + obn = obp; /* Link from last property */ qsort(&proplist[0], run, sizeof(propsort), compsort); @@ -3916,11 +4000,11 @@ void parallel_sort(struct objlist *ob1, struct nlist *tp1, int idx1, int run) } /*--------------------------------------------------------------*/ -/* Attempt to match two property lists representing serial/ */ +/* Attempt to match two property lists representing series/ */ /* parallel combinations of devices. Where the number of */ /* devices is not equal, try to reduce the one with more */ /* devices to match. If there are the same number of parallel */ -/* or serial devices, check if they match better by swapping. */ +/* or series devices, check if they match better by swapping. */ /* The goal is to get two property lists that can be checked by */ /* 1-to-1 matching in PropertyMatch(). */ /*--------------------------------------------------------------*/ @@ -3933,7 +4017,7 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, int p, n; int run, cnt, idx1, idx2, max1, max2; - int icount1, icount2, changed; + int icount1, icount2, changed, result; char *netwk1, *netwk2; char *c1, *c2; struct valuelist *vl; @@ -3947,6 +4031,10 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, iterations++; changed = 0; + /* Remove group tags if they no longer contain series devices */ + while (remove_group_tags(pre1)); + while (remove_group_tags(pre2)); + // How many property records are there? // If there is only one property record in each instance then // there is nothing to be sorted. @@ -4007,8 +4095,8 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, strcat(netwk2, "D"); } - // Printf("Diagnostic: network1 is \"%s\" " - // "network2 is \"%s\"\n", netwk1, netwk2); + /* Printf("Diagnostic: network1 is \"%s\" " + "network2 is \"%s\"\n", netwk1, netwk2); */ /* Method to resolve any network to the largest solution that */ /* matches both sides. Use the netwk1, netwk2 strings to determine */ @@ -4021,7 +4109,7 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, /* in the other. If non-summing parameters of interest match, */ /* then merge all devices that can be merged until both sides */ /* have the same number of devices. */ - /* 2) Find serial devices that have more elements in one circuit */ + /* 2) Find series devices that have more elements in one circuit */ /* than in the other. If non-summing parameters of interest */ /* match, then merge all devices that can be merged until */ /* both sides have the same number of devices. */ @@ -4076,8 +4164,19 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, // Printf("Circuit 1 has %d devices in parallel while circuit 2 has %d\n", // (max1 == 1) ? 0 : max1, (max2 == 1) ? 0 : max2); - if (max1 > 1) changed += parallel_optimize(ob1, tp1, idx1, max1); - if (max2 > 1) changed += parallel_optimize(ob2, tp2, idx2, max2); + if (max1 > 1) { + result = parallel_optimize(ob1, tp1, idx1, max1, FALSE); + if (result > 0) changed += result; + else if ((result < 0) && (max1 > max2)) + changed += series_optimize(ob1, tp1, idx1, max1, TRUE); + } + + if (max2 > 1) { + result = parallel_optimize(ob2, tp2, idx2, max2, FALSE); + if (result > 0) changed += result; + else if ((result < 0) && (max2 > max1)) + changed += series_optimize(ob2, tp2, idx2, max2, TRUE); + } if (changed > 0) { FREE(netwk1); @@ -4110,9 +4209,9 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, } } - /* Case 2: Serial devices with more elements in one circuit */ + /* Case 2: Series devices with more elements in one circuit */ - /* Find the largest group of serial devices in circuit1 */ + /* Find the largest group of series devices in circuit1 */ run = 0; cnt = 0; idx1 = 0; @@ -4136,7 +4235,7 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, if (*c1 == '\0') break; } - /* Find the largest group of serial devices in circuit2 */ + /* Find the largest group of series devices in circuit2 */ run = 0; cnt = 0; idx2 = 0; @@ -4164,10 +4263,21 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, // Printf("Circuit 1 has %d devices in series while circuit 2 has %d\n", // (max1 == 1) ? 0 : max1, (max2 == 1) ? 0 : max2); - if (max1 > 1) changed += serial_optimize(ob1, tp1, idx1, max1); - if (max2 > 1) changed += serial_optimize(ob2, tp2, idx2, max2); + if (max1 > 1) { + result = series_optimize(ob1, tp1, idx1, max1, FALSE); + if (result > 0) changed += result; + else if ((result < 0) && (max1 > max2)) + changed += parallel_optimize(ob1, tp1, idx1, max1, TRUE); + } + if (max2 > 1) { + result = series_optimize(ob2, tp2, idx2, max2, FALSE); + if (result > 0) changed += result; + else if ((result < 0) && (max2 > max1)) + changed += parallel_optimize(ob2, tp2, idx2, max2, TRUE); + } if (changed > 0) { + FREE(netwk1); FREE(netwk2); continue; @@ -4175,21 +4285,21 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, if (max1 > 1) { /* Re-link first property, because it may have been moved */ - serial_sort(pre1, tp1, idx1, max1); + series_sort(pre1, tp1, idx1, max1); ob1 = pre1->next; } if (max2 > 1) { /* Re-link first property, because it may have been moved */ - serial_sort(pre2, tp2, idx2, max2); + series_sort(pre2, tp2, idx2, max2); ob2 = pre2->next; } - /* Do not run serial_combine until all other changes have been resolved */ + /* Do not run series_combine until all other changes have been resolved */ if (changed == 0) { if (max2 > max1) - changed += serial_combine(ob2, tp2, idx2, max2, ob1, tp1, idx1, max1); + changed += series_combine(ob2, tp2, idx2, max2, ob1, tp1, idx1, max1); else if (max1 > max2) - changed += serial_combine(ob1, tp1, idx1, max1, ob2, tp2, idx2, max2); + changed += series_combine(ob1, tp1, idx1, max1, ob2, tp2, idx2, max2); } FREE(netwk1); @@ -4198,7 +4308,7 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, /* Continue looping until there are no further changes to be made */ } if (iterations > 1) - Printf("No more changes can be made to serial/parallel networks.\n"); + Printf("No more changes can be made to series/parallel networks.\n"); } /*--------------------------------------------------------------*/ @@ -4208,7 +4318,7 @@ void PropertySortAndCombine(struct objlist *pre1, struct nlist *tp1, /* critical property (if defined), and merge devices with the */ /* same properties (by summing property "M" for devices) */ /* */ -/* For final optimization, if run == 1 and M > 1, then merge */ +/* For final optimization, if comb == 1 and M > 1, then merge */ /* the critical property over M and set M to 1. */ /* */ /* Return the number of devices modified. */ @@ -4220,7 +4330,8 @@ typedef struct _proplink { proplinkptr next; } proplink; -int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial) +int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series, + int comb) { struct objlist *ob2, *obt; struct property *kl, *m_rec, **plist; @@ -4229,11 +4340,13 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial) int pcount, p, i, j, k, pmatch, ival, crit, ctype; double dval; static struct valuelist nullvl, dfltvl; - char multiple[2]; - int changed = 0; + char multiple[2], other[2]; + int changed = 0, fail = 0; multiple[1] = '\0'; - multiple[0] = (serial == TRUE) ? 'S' : 'M'; + multiple[0] = (series == TRUE) ? 'S' : 'M'; + other[1] = '\0'; + other[0] = (series == TRUE) ? 'M' : 'S'; nullvl.type = PROP_INTEGER; nullvl.value.ival = 0; @@ -4266,15 +4379,15 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial) // To do: deal with possibility of multiple critical properties // per instance? - if ((serial == FALSE) && (kl->merge == MERGE_ADD_CRIT || - kl->merge == MERGE_PAR_CRIT)) { + if ((series == FALSE) && (kl->merge & MERGE_P_CRIT)) { crit = kl->idx; - ctype = kl->merge; + ctype = kl->merge & (MERGE_P_ADD | MERGE_P_PAR); } - else if ((serial == TRUE) && (kl->merge == MERGE_SER_CRIT)) { + else if ((series == TRUE) && (kl->merge & MERGE_S_CRIT)) { crit = kl->idx; - ctype = MERGE_ADD_CRIT; + ctype = kl->merge & (MERGE_S_ADD | MERGE_S_PAR); } + kl = (struct property *)HashNext(&(tp->propdict)); } // Recast the linked list as an array @@ -4308,6 +4421,16 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial) vlist[0][i] = vl; } } + if (kl == NULL) { + /* Prevent setting both M > 1 and S > 1 in any one */ + /* device, as it is ambiguous. */ + + if ((*matchfunc)(vl->key, other)) { + if (vl->type == PROP_INTEGER) + if (vl->value.ival > 1) + fail = 1; + } + } else if (kl != NULL) { vlist[kl->idx][i] = vl; } @@ -4327,174 +4450,181 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial) } // Now combine records with same properties by summing M (S). - for (i = 0; i < run - 1; i++) { - for (j = 1; j < run; j++) { - pmatch = 0; - for (p = 1; p < pcount; p++) { - kl = plist[p]; - vl = vlist[p][i]; - vl2 = vlist[p][j]; - if (vl == NULL && vl2 == NULL) { - pmatch++; - continue; - } + if (comb == FALSE) { + for (i = 0; i < run - 1; i++) { + for (j = 1; j < run; j++) { + pmatch = 0; + for (p = 1; p < pcount; p++) { + kl = plist[p]; + vl = vlist[p][i]; + vl2 = vlist[p][j]; + if (vl == NULL && vl2 == NULL) { + pmatch++; + continue; + } - // If either value is missing, it takes kl->pdefault - // and must apply promotions if necessary. + // If either value is missing, it takes kl->pdefault + // and must apply promotions if necessary. - else if (vl == NULL || vl2 == NULL) { - if (vl == NULL) { - if (kl->type != vlist[p][j]->type) + else if (vl == NULL || vl2 == NULL) { + if (vl == NULL) { + if (kl->type != vlist[p][j]->type) PromoteProperty(kl, vl2); - } - else { - if (kl->type != vlist[p][i]->type) + } + else { + if (kl->type != vlist[p][i]->type) PromoteProperty(kl, vl); - } - vl = &dfltvl; - dfltvl.type = kl->type; - switch (kl->type) { - case PROP_STRING: + } + vl = &dfltvl; + dfltvl.type = kl->type; + switch (kl->type) { + case PROP_STRING: dfltvl.value.string = kl->pdefault.string; break; - case PROP_INTEGER: + case PROP_INTEGER: dfltvl.value.ival = kl->pdefault.ival; break; - case PROP_DOUBLE: - case PROP_VALUE: + case PROP_DOUBLE: + case PROP_VALUE: dfltvl.value.ival = kl->pdefault.ival; break; - case PROP_EXPRESSION: + case PROP_EXPRESSION: dfltvl.value.stack = kl->pdefault.stack; break; - } - } + } + } - // Critical properties can be multiplied up by M (S) and do not - // need to match. May want a more nuanced comparison, though. - if (p == crit) { - pmatch++; - continue; - } + // Critical properties can be multiplied up by M (S) and do not + // need to match. May want a more nuanced comparison, though. + if (p == crit) { + pmatch++; + continue; + } - switch(vl->type) { - case PROP_DOUBLE: - case PROP_VALUE: - dval = 2 * fabs(vl->value.dval - vl2->value.dval) + switch(vl->type) { + case PROP_DOUBLE: + case PROP_VALUE: + dval = 2 * fabs(vl->value.dval - vl2->value.dval) / (vl->value.dval + vl2->value.dval); - if (dval <= kl->slop.dval) pmatch++; - break; - case PROP_INTEGER: - ival = abs(vl->value.ival - vl2->value.ival); - if (ival <= kl->slop.ival) pmatch++; - break; - case PROP_STRING: - if ((*matchfunc)(vl->value.string, vl2->value.string)) pmatch++; - break; + if (dval <= kl->slop.dval) pmatch++; + break; + case PROP_INTEGER: + ival = abs(vl->value.ival - vl2->value.ival); + if (ival <= kl->slop.ival) pmatch++; + break; + case PROP_STRING: + if ((*matchfunc)(vl->value.string, vl2->value.string)) pmatch++; + break; - /* will not attempt to match expressions, but it could - * be done with some minor effort by matching each - * stack token and comparing those that are strings. - */ - } - } - if (pmatch == (pcount - 1)) { - // Sum M (S) (p == 0) records and remove one record - if (vlist[0][i] == NULL) { - // Add this to the end of the property record - // find ith record in ob - p = 0; - for (ob2 = ob; p != i; ob2 = ob2->next, p++); - // Count entries, add one, reallocate - for (p = 0;; p++) { - vl = &ob2->instance.props[p]; - if (vl->type == PROP_ENDLIST) break; - } - p++; - newvlist = (struct valuelist *)CALLOC(p + 1, - sizeof(struct valuelist)); - // Move end record forward - vl = &newvlist[p]; - vl->key = NULL; - vl->type = PROP_ENDLIST; - vl->value.ival = 0; - - // Add "M" ("S") record behind it - vl = &newvlist[--p]; - vl->key = strsave(multiple); - vl->type = PROP_INTEGER; - vl->value.ival = 1; - vlist[0][i] = vl; - // Copy the rest of the records and regenerate vlist - for (--p; p >= 0; p--) { - vl = &newvlist[p]; - vl->key = ob2->instance.props[p].key; - vl->type = ob2->instance.props[p].type; - vl->value = ob2->instance.props[p].value; - - kl = (struct property *)HashLookup(vl->key, &(tp->propdict)); - if (kl != NULL) vlist[kl->idx][i] = vl; + /* will not attempt to match expressions, but it could + * be done with some minor effort by matching each + * stack token and comparing those that are strings. + */ } - - // Replace instance properties with the new list - FREE(ob2->instance.props); - ob2->instance.props = newvlist; } + if (fail == 1) { + /* If failure due to need to prevent M > 1 and S > 1 on */ + /* the same device, then do not do optimization. If */ + /* optimization could have been done, return -1. */ - if (vlist[0][j] == NULL) { - vlist[0][j] = &nullvl; // Mark this position - vlist[0][i]->value.ival++; + if (pmatch == (pcount - 1)) + changed = -1; } - else if (vlist[0][i]->value.ival > 0) { - vlist[0][i]->value.ival += vlist[0][j]->value.ival; - vlist[0][j]->value.ival = 0; + else if (pmatch == (pcount - 1)) { + // Sum M (S) (p == 0) records and remove one record + if (vlist[0][i] == NULL) { + // Add this to the end of the property record + // find ith record in ob + p = 0; + for (ob2 = ob; p != i; ob2 = ob2->next, p++); + // Count entries, add one, reallocate + for (p = 0;; p++) { + vl = &ob2->instance.props[p]; + if (vl->type == PROP_ENDLIST) break; + } + p++; + newvlist = (struct valuelist *)CALLOC(p + 1, + sizeof(struct valuelist)); + // Move end record forward + vl = &newvlist[p]; + vl->key = NULL; + vl->type = PROP_ENDLIST; + vl->value.ival = 0; + + // Add "M" ("S") record behind it + vl = &newvlist[--p]; + vl->key = strsave(multiple); + vl->type = PROP_INTEGER; + vl->value.ival = 1; + vlist[0][i] = vl; + // Copy the rest of the records and regenerate vlist + for (--p; p >= 0; p--) { + vl = &newvlist[p]; + vl->key = ob2->instance.props[p].key; + vl->type = ob2->instance.props[p].type; + vl->value = ob2->instance.props[p].value; + + kl = (struct property *)HashLookup(vl->key, &(tp->propdict)); + if (kl != NULL) vlist[kl->idx][i] = vl; + } + + // Replace instance properties with the new list + FREE(ob2->instance.props); + ob2->instance.props = newvlist; + } + + if (vlist[0][j] == NULL) { + vlist[0][j] = &nullvl; // Mark this position + vlist[0][i]->value.ival++; + } + else if (vlist[0][j]->value.ival > 0) { + vlist[0][i]->value.ival += vlist[0][j]->value.ival; + vlist[0][j]->value.ival = 0; + } } + else j++; } - else j++; } } - // For the special case of run == 1, reduce M (or S) to 1 by - // merging the critical property (if any) - - if ((run == 1) && (crit != -1) && (vlist[0][0] != NULL)) { - int mult = vlist[0][0]->value.ival; - if (mult > 1) { - vl = vlist[crit][0]; - - if ((serial == TRUE) && (ctype = MERGE_SER_CRIT)) { - if (vl->type == PROP_INTEGER) - vl->value.ival *= mult; - else if (vl->type == PROP_DOUBLE) - vl->value.dval *= (double)mult; - vlist[0][0]->value.ival = 1; - changed += mult; - } - else if (serial == FALSE && (ctype = MERGE_ADD_CRIT)) { - if (vl->type == PROP_INTEGER) - vl->value.ival *= mult; - else if (vl->type == PROP_DOUBLE) - vl->value.dval *= (double)mult; - vlist[0][0]->value.ival = 1; - changed += mult; - } - else if (serial == FALSE && (ctype = MERGE_PAR_CRIT)) { - /* Technically one should check if divide-by-mult */ - /* reduces the value to < 1 and promote to double */ - /* if so, but that's a very unlikely case. */ - if (vl->type == PROP_INTEGER) - vl->value.ival /= mult; - else if (vl->type == PROP_DOUBLE) - vl->value.dval /= (double)mult; - vlist[0][0]->value.ival = 1; - changed += mult; + // If comb == TRUE, reduce M (or S) to 1 by merging the critical + // property (if any) + + if ((comb == TRUE) && (crit != -1)) { + int mult; + for (i = 0; i < run; i++) { + if (vlist[0][i] == NULL) continue; + mult = vlist[0][i]->value.ival; + if (mult > 1) { + changed = 0; + vl = vlist[crit][i]; + + if ((ctype == MERGE_S_ADD) || (ctype == MERGE_P_ADD)) { + if (vl->type == PROP_INTEGER) + vl->value.ival *= mult; + else if (vl->type == PROP_DOUBLE) + vl->value.dval *= (double)mult; + vlist[0][i]->value.ival = 1; + changed += mult; + } + else if ((ctype == MERGE_S_PAR) || (ctype == MERGE_P_PAR)) { + /* Technically one should check if divide-by-mult */ + /* reduces the value to < 1 and promote to double */ + /* if so, but that's a very unlikely case. */ + if (vl->type == PROP_INTEGER) + vl->value.ival /= mult; + else if (vl->type == PROP_DOUBLE) + vl->value.dval /= (double)mult; + vlist[0][i]->value.ival = 1; + changed += mult; + } + if (changed > 0) { + if (series) + Printf("Combined %d series devices.\n", changed); + else + Printf("Combined %d parallel devices.\n", changed); + } } - if (changed > 0) { - if (serial) - Printf("Combined %d serial devices.\n", changed); - else - Printf("Combined %d parallel devices.\n", changed); - } } } @@ -4512,6 +4642,8 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial) ob2 = ob2->next; } +cleanup: + // Cleanup memory allocation for (p = 0; p < pcount; p++) { kl = (struct property *)plist[p]; @@ -5003,7 +5135,7 @@ PropertyCheckMismatch(struct objlist *tp1, struct nlist *tc1, } /*--------------------------------------------------------------*/ -/* Dump a description of a device's serial/parallel network */ +/* Dump a description of a device's series/parallel network */ /*--------------------------------------------------------------*/ void DumpNetwork(struct objlist *ob, int cidx) @@ -5049,6 +5181,23 @@ void DumpNetwork(struct objlist *ob, int cidx) } /*--------------------------------------------------------------*/ +/* Call DumpNetwork() on each device in the object list */ +/*--------------------------------------------------------------*/ + +void DumpNetworkAll(char *model, int file) +{ + struct nlist *tp; + struct objlist *ob; + + if ((tp = LookupCellFile(model, file)) == NULL) { + Printf("Cell: %s does not exist.\n", model); + } + for (ob = tp->cell; ob; ob = ob->next) + if (ob->type == FIRSTPIN) + DumpNetwork(ob, file); +} + +/*--------------------------------------------------------------*/ /* Compare the properties of two objects. The passed values */ /* ob1 and ob2 are pointers to the first entry (firstpin) of */ /* each object. */ @@ -5152,7 +5301,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print, #endif } - // Attempt to organize devices by serial and parallel combination + // Attempt to organize devices by series and parallel combination if (t1type == PROPERTY && t2type == PROPERTY) PropertySortAndCombine(obn1, tc1, obn2, tc2); @@ -5173,7 +5322,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print, if ((t1type != PROPERTY) && (checked_one == TRUE)) { // t2 has more property records than t1, and they did not get // merged equally by PropertySortAndCombine(). - Fprintf(stdout, "Circuit 1 parallel/serial network does not match" + Fprintf(stdout, "Circuit 1 parallel/series network does not match" " Circuit 2\n"); DumpNetwork(ob1, 1); DumpNetwork(ob2, 2); @@ -5224,7 +5373,7 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print, else if ((t2type != PROPERTY) && (checked_one == TRUE)) { // t1 has more property records than t2, and they did not get // merged equally by PropertySortAndCombine(). - Fprintf(stdout, "Circuit 2 parallel/serial network does not match" + Fprintf(stdout, "Circuit 2 parallel/series network does not match" " Circuit 1\n"); DumpNetwork(ob1, 1); DumpNetwork(ob2, 2); @@ -5278,13 +5427,13 @@ PropertyMatch(struct objlist *ob1, struct objlist *ob2, int do_print, inst2, FALSE, FALSE, &multmatch, NULL); if (multmatch == 1) { /* Final attempt: Reduce M to 1 on both devices */ - PropertyOptimize(tp1, tc1, 1, FALSE); - PropertyOptimize(tp2, tc2, 1, FALSE); + PropertyOptimize(tp1, tc1, 1, FALSE, TRUE); + PropertyOptimize(tp2, tc2, 1, FALSE, TRUE); } else if (multmatch == 2) { /* Final attempt: Reduce S to 1 on both devices */ - PropertyOptimize(tp1, tc1, 1, TRUE); - PropertyOptimize(tp2, tc2, 1, TRUE); + PropertyOptimize(tp1, tc1, 1, TRUE, TRUE); + PropertyOptimize(tp2, tc2, 1, TRUE, TRUE); } #ifdef TCL_NETGEN mlist = diff --git a/base/netcmp.h b/base/netcmp.h index 16b544e..497ea09 100644 --- a/base/netcmp.h +++ b/base/netcmp.h @@ -36,7 +36,8 @@ extern int EquivalenceNodes(char *name1, int file1, char *name2, int file2); extern int EquivalenceClasses(char *name1, int file1, char *name2, int file2); extern int IgnoreClass(char *name, int file, unsigned char type); extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist); -extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial); +extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, + int series, int comb); extern int CreateCompareQueue(char *, int, char *, int); extern int GetCompareQueueTop(char **, int *, char **, int *); @@ -47,6 +48,9 @@ extern void PrintIllegalClasses(); extern void PrintIllegalNodeClasses(); extern void PrintIllegalElementClasses(); +extern void DumpNetwork(struct objlist *ob, int cidx); +extern void DumpNetworkAll(char *name, int file); + #ifdef TCL_NETGEN extern int EquivalentNode(); extern int EquivalentElement(); diff --git a/base/netfile.c b/base/netfile.c index ff37c4a..36020ec 100644 --- a/base/netfile.c +++ b/base/netfile.c @@ -175,7 +175,7 @@ void CloseFile(char *filename) /* STUFF TO READ INPUT FILES */ static char *line = NULL; /* actual line read in */ -static char *linetok; /* line copied to this, then munged by strtok */ +static char *linetok; /* line copied to this, then munged by strdtok */ static int linesize = 0; /* amount of memory allocated for line */ static int linenum; char *nexttok; @@ -191,7 +191,7 @@ struct filestack { static struct filestack *OpenFiles = NULL; -#define TOKEN_DELIMITER " \t\n\r" +#define WHITESPACE_DELIMITER " \t\n\r" /*----------------------------------------------------------------------*/ /* TrimQuoted() --- */ @@ -296,7 +296,7 @@ int GetNextLineNoNewline(char *delimiter) strcpy(linetok, line); TrimQuoted(linetok); - nexttok = strtok(linetok, delimiter); + nexttok = strdtok(linetok, WHITESPACE_DELIMITER, delimiter); return 0; } @@ -319,10 +319,9 @@ void GetNextLine(char *delimiter) void SkipTok(char *delimiter) { if (nexttok != NULL && - (nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER)) - != NULL) + (nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter))) return; - GetNextLine((delimiter) ? delimiter : TOKEN_DELIMITER); + GetNextLine(delimiter); } /*----------------------------------------------------------------------*/ @@ -332,7 +331,7 @@ void SkipTok(char *delimiter) void SkipTokNoNewline(char *delimiter) { - nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER); + nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter); } /*----------------------------------------------------------------------*/ @@ -354,12 +353,12 @@ void SpiceTokNoNewline(void) { int contline; - if ((nexttok = strtok(NULL, TOKEN_DELIMITER)) != NULL) return; + if ((nexttok = strdtok(NULL, WHITESPACE_DELIMITER, NULL)) != NULL) return; while (nexttok == NULL) { contline = getc(infile); if (contline == '*') { - GetNextLine(TOKEN_DELIMITER); + GetNextLine(WHITESPACE_DELIMITER); SkipNewLine(NULL); continue; } @@ -367,7 +366,28 @@ void SpiceTokNoNewline(void) ungetc(contline, infile); return; } - if (GetNextLineNoNewline(TOKEN_DELIMITER) == -1) break; + if (GetNextLineNoNewline(WHITESPACE_DELIMITER) == -1) break; + } +} + +/*----------------------------------------------------------------------*/ +/* Skip to the next token, ignoring any C-style comments. */ +/*----------------------------------------------------------------------*/ + +void SkipTokComments(char *delimiter) +{ + SkipTok(delimiter); + while (nexttok) { + if (match(nexttok, "//")) { + SkipNewLine(delimiter); + SkipTok(delimiter); + } + else if (match(nexttok, "/*")) { + while (nexttok && !match(nexttok, "*/")) + SkipTok(delimiter); + if (nexttok) SkipTok(delimiter); + } + else break; } } @@ -378,7 +398,7 @@ void SpiceTokNoNewline(void) void SkipNewLine(char *delimiter) { while (nexttok != NULL) - nexttok = strtok(NULL, (delimiter) ? delimiter : TOKEN_DELIMITER); + nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter); } /*----------------------------------------------------------------------*/ @@ -395,7 +415,7 @@ void SpiceSkipNewLine(void) while (contline == '+') { ungetc(contline, infile); - GetNextLine(TOKEN_DELIMITER); + GetNextLine(WHITESPACE_DELIMITER); SkipNewLine(NULL); contline = getc(infile); } @@ -403,6 +423,112 @@ void SpiceSkipNewLine(void) } /*----------------------------------------------------------------------*/ +/* Function similar to strtok() for token parsing. The difference is */ +/* that it takes two sets of delimiters. The first is whitespace */ +/* delimiters, which separate tokens. The second is functional */ +/* delimiters, which separate tokens and have additional meaning, such */ +/* as parentheses, commas, semicolons, etc. The parser needs to know */ +/* when such tokens occur in the string, so they are returned as */ +/* individual tokens. */ +/* */ +/* Definition of delim2: String of single delimiter characters. The */ +/* special character "X" (which is never a delimiter in practice) is */ +/* used to separate single-character delimiters from two-character */ +/* delimiters (this presumably could be further extended as needed). */ +/* so ",;()" would be a valid delimiter set, but to include C-style */ +/* comments and verilog-style parameter lists, one would need */ +/* ",;()X/**///#(". */ +/*----------------------------------------------------------------------*/ + +char *strdtok(char *pstring, char *delim1, char *delim2) +{ + static char *stoken = NULL; + static char *sstring = NULL; + char *s, *s2; + char first = FALSE; + int twofer; + + if (pstring != NULL) { + /* Allocate enough memory to hold the string; tokens will be put here */ + if (sstring != NULL) FREE(sstring); + sstring = (char *)MALLOC(strlen(pstring) + 1); + stoken = pstring; + first = TRUE; + } + + /* Skip over "delim1" delimiters at the string beginning */ + for (; *stoken; stoken++) { + for (s2 = delim1; *s2; s2++) + if (*stoken == *s2) + break; + if (*s2 == '\0') break; + } + + if (*stoken == '\0') return NULL; /* Finished parsing */ + + /* "stoken" is now set. Now find the end of the current token */ + + /* Check string from position stoken. If a character in "delim2" is found, */ + /* save the character in "lastdelim", null the byte at that position, and */ + /* return the token. If a character in "delim1" is found, do the same but */ + /* continue checking characters as long as there are contiguous "delim1" */ + /* characters. If the series ends in a character from "delim2", then treat */ + /* as for "delim2" above. If not, then set "lastdelim" to a null byte and */ + /* return the token. */ + + for (s = stoken; *s; s++) { + twofer = FALSE; + for (s2 = delim2; s2 && *s2; s2++) { + if (*s2 == 'X') { + twofer = TRUE; + continue; + } + if (twofer) { + if ((*s == *s2) && (*(s + 1) == *(s2 + 1))) { + if (s == stoken) { + strncpy(sstring, stoken, 2); + *(sstring + 2) = '\0'; + stoken = s + 2; + } + else { + strncpy(sstring, stoken, (int)(s - stoken)); + *(sstring + (s - stoken)) = '\0'; + stoken = s; + } + return sstring; + } + s2++; + if (*s2 == '\0') break; + } + else if (*s == *s2) { + if (s == stoken) { + strncpy(sstring, stoken, 1); + *(sstring + 1) = '\0'; + stoken = s + 1; + } + else { + strncpy(sstring, stoken, (int)(s - stoken)); + *(sstring + (s - stoken)) = '\0'; + stoken = s; + } + return sstring; + } + } + for (s2 = delim1; *s2; s2++) { + if (*s == *s2) { + strncpy(sstring, stoken, (int)(s - stoken)); + *(sstring + (s - stoken)) = '\0'; + stoken = s; + return sstring; + } + } + } + strcpy(sstring, stoken); /* Just copy to the end */ + stoken = s; + return sstring; +} + +/*----------------------------------------------------------------------*/ void InputParseError(FILE *f) { diff --git a/base/netfile.h b/base/netfile.h index dbf22b6..fbcf413 100644 --- a/base/netfile.h +++ b/base/netfile.h @@ -29,6 +29,7 @@ extern int File; extern char *nexttok; #define SKIPTO(a) do {SkipTok(NULL);} while (!match(nexttok,a)) +extern char *strdtok(char *pstring, char *delim1, char *delim2); extern void SkipTok(char *delimiter); extern void SkipTokNoNewline(char *delimiter); extern void SkipNewLine(char *delimiter); diff --git a/base/netgen.c b/base/netgen.c index 6968987..2c9fc88 100644 --- a/base/netgen.c +++ b/base/netgen.c @@ -898,6 +898,32 @@ void SetParallelCombine(int value) } /*----------------------------------------------------------------------*/ +/* Same as above, for series (here for symmetry, although "property */ +/* series all" would be an odd command to issue, and "property series */ +/* none" is the default, so not needed). */ +/*----------------------------------------------------------------------*/ + +struct nlist *SetSeriesCombineFlag(struct hashlist *p, void *clientdata) +{ + struct nlist *ptr; + int *value = (int *)clientdata; + + ptr = (struct nlist *)(p->ptr); + if (*value == TRUE) + ptr->flags &= (~COMB_SERIES); + else + ptr->flags |= COMB_SERIES; + + return NULL; /* NULL keeps search alive */ +} + +void SetSeriesCombine(int value) +{ + ClearDumpedList(); + RecurseCellHashTable2(SetSeriesCombineFlag, (void *)(&value)); +} + +/*----------------------------------------------------------------------*/ /* Delete a property from the master cell record. */ /*----------------------------------------------------------------------*/ @@ -992,15 +1018,15 @@ PropertyTolerance(char *name, int fnum, char *key, int ival, double dval) /*----------------------------------------------------------------------*/ int -PropertyMerge(char *name, int fnum, char *key, int merge_type) +PropertyMerge(char *name, int fnum, char *key, int merge_type, int merge_mask) { struct property *kl = NULL; struct nlist *tc; int result; if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) { - result = PropertyMerge(name, Circuit1->file, key, merge_type); - result = PropertyMerge(name, Circuit2->file, key, merge_type); + result = PropertyMerge(name, Circuit1->file, key, merge_type, merge_mask); + result = PropertyMerge(name, Circuit2->file, key, merge_type, merge_mask); return result; } @@ -1016,7 +1042,8 @@ PropertyMerge(char *name, int fnum, char *key, int merge_type) return -1; } else { - kl->merge = merge_type; + kl->merge &= ~merge_mask; + kl->merge |= merge_type; } return 0; } @@ -2462,8 +2489,7 @@ int ConvertStringToInteger(char *string, int *ival) *ival = (int)lval; return 1; } - else if (eptr == string) - return 0; /* No conversion */ + else return 0; /* No conversion */ } /*--------------------------------------------------------------*/ @@ -2868,50 +2894,50 @@ void ConnectAllNodes(char *model, int file) } /*----------------------------------------------------------------------*/ -/* Serial and Parallel combination: */ -/* All devices of the same type that exist in serial and parallel */ +/* Series and Parallel combination: */ +/* All devices of the same type that exist in series and parallel */ /* combinations will be treated as a single device in a network. */ -/* Serial connections are only allowed for resistors and inductors. */ -/* Any device may be connected in parallel. For combinations of serial */ +/* Series connections are only allowed for resistors and inductors. */ +/* Any device may be connected in parallel. For combinations of series */ /* and parallel, as in a resistor network, there is a set of rules: */ /* */ -/* Running parallel and serial checks: */ +/* Running parallel and series checks: */ /* 1. Run parallel once. If a repeat run and no devices are merged, */ /* then go to 4. */ -/* 2. Run serial until no devices are merged. */ -/* 3. If serial ran more than once, then go to 1. */ +/* 2. Run series until no devices are merged. */ +/* 3. If series ran more than once, then go to 1. */ /* 4. End merge */ /* */ /* Each merge procedure, when it finds two devices that can be merged, */ /* removes the second device from the netlist and adds its properties */ -/* to the first device. If a serial merge, then the nodes are adjusted */ +/* to the first device. If a series merge, then the nodes are adjusted */ /* appropriately. Where A is the property list of the first device and */ /* B is the property list of the second device, the first and last */ /* properties of A and the first property of B may require a marker to */ /* indicate the topology of the network, as follows (in order): */ /* */ /* For a parallel merge: */ -/* 1) If A has serial components then tag first property of A with */ +/* 1) If A has series components then tag first property of A with */ /* "open" and tag first property of B with "close". */ -/* 2) If B has serial components then tag first property of B with */ +/* 2) If B has series components then tag first property of B with */ /* "open". */ /* */ -/* For a serial merge: */ +/* For a series merge: */ /* 1) If A has unbalanced "opens", then add "close" to first */ /* property of B to balance the "opens". */ -/* 2) Always tag B with "serial". */ +/* 2) Always tag B with "series". */ /* */ /* Tags are indicated by a property named "_tag" which has a string */ -/* value of ordered characters, "+" for serial, "(" for open, and ")" */ +/* value of ordered characters, "+" for series, "(" for open, and ")" */ /* for close. A device with only one property record has no "_tag" */ /* record. A device which is in parallel with the device(s) in front */ /* of it is implicitly parallel by not having an "+" tag, and may not */ /* have a tag at all. */ /* */ /* The property check routine is responsible for comparing device */ -/* serial/parallel networks against each other. Otherwise, each */ -/* serial/parallel network is considered topologically as a single */ -/* device, and any differences in the serial/parallel networks between */ +/* series/parallel networks against each other. Otherwise, each */ +/* series/parallel network is considered topologically as a single */ +/* device, and any differences in the series/parallel networks between */ /* two circuits being matched will be treated as a property error. */ /*----------------------------------------------------------------------*/ @@ -2927,7 +2953,8 @@ int add_prop_tag(struct objlist *obr, char tagc) char *tmpstr; hastag = FALSE; - for (nob = obr; nob->next && nob->next->type == PROPERTY; nob = nob->next) { + for (nob = obr; nob; nob = nob->next) { + if (nob->type != PROPERTY) break; for (i = 0; ; i++) { kv = &(nob->instance.props[i]); if (kv->type == PROP_ENDLIST) break; @@ -3018,6 +3045,75 @@ void add_balancing_close(struct objlist *ob1, struct objlist *ob2) while (opentags-- > 0) add_prop_tag(nob, ')'); } +/* Remove unneeded group tags, when device merging has removed all but */ +/* one, or all but parallel devices inside a group. For simplicity, */ +/* handle only one group at a time. Return 1 if a group was removed */ +/* and 0 if not. The caller should run repeatedly until the routine */ +/* returns 0. */ + +int remove_group_tags(struct objlist *ob) +{ + struct objlist *nob, *sob; + int i, si, stags; + struct valuelist *kv; + char *tag; + + /* Find the first property record in ob. */ + for (nob = ob->next; nob && nob->type != FIRSTPIN; nob = nob->next) + if (nob->type == PROPERTY) + break; + if (nob->type != PROPERTY) return 0; // shouldn't happen + + for (sob = NULL; nob && nob->type == PROPERTY; nob = nob->next) { + for (i = 0; ; i++) { + kv = &(nob->instance.props[i]); + if (kv->type == PROP_ENDLIST) break; + if (kv->type == PROP_STRING) { + if (!strcmp(kv->key, "_tag")) { + for (tag = kv->value.string; *tag != '\0'; tag++) { + if (*tag == '(') { + sob = nob; /* Save position of open group */ + si = i; /* Save index of open group */ + stags = 0; /* Check for series tags */ + } + else if (*tag == '+') + stags++; + else if (*tag == ')') { + if (stags == 0) { + /* Remove close tag */ + for (++i; ; i++) { + nob->instance.props[i - 1] = nob->instance.props[i]; + if (nob->instance.props[i].type == PROP_ENDLIST) break; + } + /* Remove open tag */ + for (i = si + 1; ; i++) { + sob->instance.props[i - 1] = sob->instance.props[i]; + if (sob->instance.props[i].type == PROP_ENDLIST) break; + } + return 1; + } + sob = NULL; + stags = 0; + } + } + } + } + } + } + if (sob != NULL) { + /* Implicit close tag at end */ + if (stags == 0) { + /* Remove open tag */ + for (i = si + 1; ; i++) { + sob->instance.props[i - 1] = sob->instance.props[i]; + if (sob->instance.props[i].type == PROP_ENDLIST) break; + } + return 1; + } + } + return 0; +} + /*----------------------------------------------------------------------*/ /* Find all devices that are of the same class and check for parallel */ /* combinations, and combine them where found, adjusting property "M" */ @@ -3229,7 +3325,7 @@ int CombineParallel(char *model, int file) if (propfirst != NULL) { - // Serial/Parallel logic: + // Series/Parallel logic: // If propfirst has _tag in properties, // then add an "open" tag at propfirst add_prop_tag(propfirst, '('); @@ -3272,9 +3368,9 @@ int CombineParallel(char *model, int file) } /*----------------------------------------------------------------------*/ -/* For the purposes of serial connection checking, find if all pins */ +/* For the purposes of series connection checking, find if all pins */ /* of two instances after the first two pins are connected to the name */ -/* nodes. This depends on the definition of a serial device as having */ +/* nodes. This depends on the definition of a series device as having */ /* two ports, but any additional ports (such as a substrate connection) */ /* must be the same for all devices in series. */ /*----------------------------------------------------------------------*/ @@ -3284,7 +3380,7 @@ int check_pin_nodes(struct objlist *ob1, struct objlist *ob2) struct objlist *nob, *pob; /* A dummy device may have both terminals connected to the same */ - /* point, triggering a false check for a serial device. */ + /* point, triggering a false check for a series device. */ if (ob1 == ob2) return FALSE; for (nob = ob1->next; nob && nob->type != FIRSTPIN; nob = nob->next) @@ -3313,12 +3409,12 @@ int check_pin_nodes(struct objlist *ob1, struct objlist *ob2) /* one. */ /* */ /* This routine depends on CombineParallel() being run first so that no */ -/* parallel devices are reported as serial. */ +/* parallel devices are reported as series. */ /* */ /* Return the number of devices merged. */ /*----------------------------------------------------------------------*/ -int CombineSerial(char *model, int file) +int CombineSeries(char *model, int file) { struct nlist *tp, *tp2; struct objlist ***instlist; @@ -3331,7 +3427,7 @@ int CombineSerial(char *model, int file) return -1; } /* Diagnostic */ - /* Printf("CombineSerial start model = %s file = %d\n", model, file); */ + /* Printf("CombineSeries start model = %s file = %d\n", model, file); */ instlist = (struct objlist ***)CALLOC((tp->nodename_cache_maxnodenum + 1), sizeof(struct objlist **)); @@ -3346,26 +3442,36 @@ int CombineSerial(char *model, int file) instlist[ob->node] = (struct objlist **)CALLOC(2, sizeof(struct objlist *)); - /* Device must be marked as able to be combined in serial. */ + /* Device must be marked as able to be combined in series. */ /* Note that devices with more than two pins are expected */ - /* to serial connect along the first two pins, and the */ + /* to series connect along the first two pins, and the */ /* remaining pins must all connect to the same nodes. By */ /* default, CLASS_RES, CLASS_RES3, and CLASS_INDUCTOR are */ - /* all allowed to combine in serial. All other devices */ - /* must have serial combination explicitly enabled. */ + /* all allowed to combine in series. All other devices */ + /* must have series combination explicitly enabled. */ /* NOTE: Arbitrarily, the first two pins of a device are */ - /* assumed to be the ones that make serial connections. */ + /* assumed to be the ones that make series connections. */ /* Additional pins, if any, do not. */ tp2 = LookupCellFile(ob->model.class, file); - if ((tp2->flags & COMB_SERIAL) && (ob->type <= 2)) + if ((tp2->flags & COMB_SERIES) && (ob->type <= 2)) { instlist[ob->node][0] = obp; + + /* Node may not be a port of the subcircuit */ + for (obn = tp->cell; obn && obn->type == PORT; obn = obn->next) { + if (obn->node == ob->node) { + /* invalidate node */ + instlist[ob->node][0] = NULL; + break; + } + } + } else /* invalidate node */ instlist[ob->node][0] = NULL; } else if (instlist[ob->node][0] == NULL) { - /* Node is not valid for serial connection */ + /* Node is not valid for series connection */ } else if (instlist[ob->node][1] == NULL) { /* Check if first instance is the same type */ @@ -3393,7 +3499,7 @@ int CombineSerial(char *model, int file) struct valuelist *kv2; /* Diagnostic */ - /* Fprintf(stdout, "Found serial instances %s and %s\n", + /* Fprintf(stdout, "Found series instances %s and %s\n", instlist[i][0]->instance.name, instlist[i][1]->instance.name); */ scnt++; @@ -3504,7 +3610,7 @@ int CombineSerial(char *model, int file) obs = obn; } - /* If 2nd device appears anywhere else in the serial device */ + /* If 2nd device appears anywhere else in the series device */ /* list, replace it with the 1st device. */ for (j = i + 1; j <= tp->nodename_cache_maxnodenum; j++) { if (instlist[j] == NULL) continue; diff --git a/base/netgen.h b/base/netgen.h index 5b33f9e..a3a18e7 100644 --- a/base/netgen.h +++ b/base/netgen.h @@ -36,9 +36,11 @@ extern struct property *PropertyString(char *name, int fnum, char *key, double slop, char *pdefault); extern int PropertyDelete(char *name, int fnum, char *key); extern void SetParallelCombine(int value); +extern void SetSeriesCombine(int value); extern int PropertyTolerance(char *name, int fnum, char *key, int ival, double dval); -extern int PropertyMerge(char *name, int fnum, char *key, int merge_type); +extern int PropertyMerge(char *name, int fnum, char *key, int merge_type, + int merge_mask); extern void ResolveProperties(char *name1, int file1, char *name2, int file2); extern void CopyProperties(struct objlist *obj_to, struct objlist *obj_from); extern int PromoteProperty(struct property *, struct valuelist *); @@ -120,7 +122,7 @@ extern void ConvertGlobals(char *name, int fnum); extern int CleanupPins(char *name, int fnum); extern void ConnectAllNodes(char *model, int fnum); extern int CombineParallel(char *model, int fnum); -extern int CombineSerial(char *model, int fnum); +extern int CombineSeries(char *model, int fnum); extern int NoDisconnectedNodes; extern int PropertyKeyMatch(char *, char *); extern int PropertyValueMatch(char *, char *); diff --git a/base/objlist.h b/base/objlist.h index 7a5763c..6e8be6c 100644 --- a/base/objlist.h +++ b/base/objlist.h @@ -103,18 +103,28 @@ struct valuelist { /* Part 3: Keys & Defaults (kept in the cell record as a hash table) */ -#define MERGE_NONE 0 /* Property does not change when devices merge */ -#define MERGE_ADD 1 /* Properties sum with device parallel merge */ -#define MERGE_ADD_CRIT 2 /* Properties sum with device parallel merge */ -#define MERGE_PAR 3 /* Properties add in parallel with device merge */ -#define MERGE_PAR_CRIT 4 /* Properties add in parallel with device merge */ -#define MERGE_SER 5 /* Properties sum with device parallel merge */ -#define MERGE_SER_CRIT 6 /* Properties sum with device parallel merge */ +#define MERGE_NONE 0x00 /* Property does not change when devices merge */ + +#define MERGE_P_ADD 0x01 /* Properties sum with device parallel merge */ +#define MERGE_P_PAR 0x02 /* Properties add in parallel with parallel merge */ +#define MERGE_P_CRIT 0x04 /* This property enables parallel merging */ + +#define MERGE_S_ADD 0x08 /* Properties sum with device series merge */ +#define MERGE_S_PAR 0x10 /* Properties add in parallel with series merge */ +#define MERGE_S_CRIT 0x20 /* This property enables series merging */ + +#define MERGE_P_MASK (MERGE_P_ADD | MERGE_P_PAR | MERGE_P_CRIT) +#define MERGE_S_MASK (MERGE_S_ADD | MERGE_S_PAR | MERGE_S_CRIT) +#define MERGE_ALL_MASK (MERGE_P_MASK | MERGE_S_MASK) + +/* Although the above are flags, "ADD" and "PAR" are mutually exclusive. */ /* Note: A "critical" merge means that the property causes the number of */ /* devices to change. e.g., transistor width is critical; transistor drain */ /* area sums when devices are merged, but does not change the number of devices.*/ /* More than one property can be critical. e.g., width and number of fingers. */ +/* Also it is possible for a property (e.g., "value") to be critical for both */ +/* series and parallel merging. */ struct property { char *key; /* name of the property */ @@ -217,7 +227,7 @@ struct nlist { /* Flags for combination allowances and prohibitions */ -#define COMB_SERIAL 0x40 +#define COMB_SERIES 0x40 #define COMB_NO_PARALLEL 0x80 extern struct nlist *CurrentCell; diff --git a/base/verilog.c b/base/verilog.c index f72c380..0eaa59e 100644 --- a/base/verilog.c +++ b/base/verilog.c @@ -57,8 +57,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "netfile.h" #include "print.h" -#define VLOG_DELIMITERS " \t\r\n,;" -#define VLOG_DELIMITERS2 " \t\r\n,()" +// See netfile.c for explanation of delimiters. 'X' +// separates single-character delimiters from two-character delimiters. +#define VLOG_DELIMITERS ",;:(){}[]=X///**/#(" +#define VLOG_PIN_NAME_DELIMITERS "()X///**/" // Global storage for verilog parameters struct hashdict verilogparams; @@ -95,21 +97,229 @@ struct bus *NewBus() return (wb); } +//------------------------------------------------------------------------- // Get bus indexes from the notation name[a:b]. If there is only "name" // then look up the name in the bus hash list and return the index bounds. // Return 0 on success, 1 on syntax error, and -1 if signal is not a bus. +// +// Note that this routine relies on the delimiter characters including +// "[", ":", and "]" when calling NextTok. +//------------------------------------------------------------------------- + +int GetBusTok(struct bus *wb) +{ + int result, start, end; + struct property *kl = NULL; + + if (wb == NULL) return 0; + else { + wb->start = -1; + wb->end = -1; + } + + if (match(nexttok, "[")) { + SkipTokComments(VLOG_DELIMITERS); + + // Check for parameter names and substitute values if found. + if (nexttok[0] == '`') { + kl = (struct property *)HashLookup(nexttok + 1, &verilogdefs); + if (kl == NULL) { + Printf("Unknown definition %s found in array notation.\n", nexttok); + } + else { + if (kl->type == PROP_STRING) { + result = sscanf(kl->pdefault.string, "%d", &start); + if (result != 1) { + Printf("Cannot parse first digit from parameter %s value %s\n", + nexttok, kl->pdefault.string); + return 1; + } + } + else if (kl->type == PROP_INTEGER) { + start = kl->pdefault.ival; + } + else if (kl->type == PROP_DOUBLE) { + start = (int)kl->pdefault.dval; + if ((double)start != kl->pdefault.dval) { + Printf("Cannot parse first digit from parameter %s value %g\n", + nexttok, kl->pdefault.dval); + return 1; + } + } + else { + Printf("Parameter %s has unknown type; don't know how to parse.\n", + nexttok); + return 1; + } + } + } + else { + result = sscanf(nexttok, "%d", &start); + if (result != 1) { + // Is name in the parameter list? + kl = (struct property *)HashLookup(nexttok, &verilogparams); + if (kl == NULL) { + Printf("Array value %s is not a number or a parameter.\n", + nexttok); + return 1; + } + else { + if (kl->type == PROP_STRING) { + result = sscanf(kl->pdefault.string, "%d", &start); + if (result != 1) { + Printf("Parameter %s has value %s that cannot be parsed" + " as an integer.\n", nexttok, kl->pdefault.string); + return 1; + } + } + else if (kl->type == PROP_INTEGER) { + start = kl->pdefault.ival; + } + else if (kl->type == PROP_DOUBLE) { + start = (int)kl->pdefault.dval; + if ((double)start != kl->pdefault.dval) { + Printf("Parameter %s has value %g that cannot be parsed" + " as an integer.\n", nexttok, kl->pdefault.dval); + return 1; + } + } + else { + Printf("Parameter %s has unknown type; don't know how" + " to parse.\n", nexttok); + return 1; + } + } + } + } + SkipTokComments(VLOG_DELIMITERS); + if (match(nexttok, "]")) { + result = 1; + end = start; // Single bit + } + else if (!match(nexttok, ":")) { + Printf("Badly formed array notation: Expected colon, found %s\n", nexttok); + return 1; + } + else { + SkipTokComments(VLOG_DELIMITERS); + + // Check for parameter names and substitute values if found. + if (nexttok[0] == '`') { + kl = (struct property *)HashLookup(nexttok + 1, &verilogdefs); + if (kl == NULL) { + Printf("Unknown definition %s found in array notation.\n", nexttok); + } + else { + if (kl->type == PROP_STRING) { + result = sscanf(kl->pdefault.string, "%d", &end); + if (result != 1) { + Printf("Cannot parse second digit from parameter " + "%s value %s\n", nexttok, kl->pdefault.string); + return 1; + } + } + else if (kl->type == PROP_INTEGER) { + end = kl->pdefault.ival; + } + else if (kl->type == PROP_DOUBLE) { + end = (int)kl->pdefault.dval; + if ((double)end != kl->pdefault.dval) { + Printf("Cannot parse second digit from parameter " + "%s value %g\n", nexttok, kl->pdefault.dval); + return 1; + } + } + else { + Printf("Parameter %s has unknown type; don't know how" + " to parse.\n", nexttok); + return 1; + } + } + } + else { + result = sscanf(nexttok, "%d", &end); + if (result != 1) { + // Is name in the parameter list? + kl = (struct property *)HashLookup(nexttok, &verilogparams); + if (kl == NULL) { + Printf("Array value %s is not a number or a parameter.\n", + nexttok); + return 1; + } + else { + if (kl->type == PROP_STRING) { + result = sscanf(kl->pdefault.string, "%d", &end); + if (result != 1) { + Printf("Parameter %s has value %s that cannot be parsed" + " as an integer.\n", nexttok, + kl->pdefault.string); + return 1; + } + } + else if (kl->type == PROP_INTEGER) { + end = kl->pdefault.ival; + } + else if (kl->type == PROP_DOUBLE) { + end = (int)kl->pdefault.dval; + if ((double)end != kl->pdefault.dval) { + Printf("Cannot parse second digit from parameter " + "%s value %g\n", nexttok, kl->pdefault.dval); + return 1; + } + } + else { + Printf("Parameter %s has unknown type; don't know how" + " to parse.\n", nexttok); + return 1; + } + } + } + } + } + wb->start = start; + wb->end = end; + + while (!match(nexttok, "]")) { + SkipTokComments(VLOG_DELIMITERS); + if (nexttok == NULL) { + Printf("End of file reached while reading array bounds.\n"); + return 1; + } + else if (match(nexttok, ";")) { + // Better than reading to end-of-file, give up on end-of-statement + Printf("End of statement reached while reading array bounds.\n"); + return 1; + } + } + } + else { + struct bus *hbus; + hbus = (struct bus *)HashLookup(nexttok, &buses); + if (hbus != NULL) { + wb->start = hbus->start; + wb->end = hbus->end; + } + else + return -1; + } + return 0; +} + +//-------------------------------------------------------------------- +// GetBus() is similar to GetBusTok() (see above), but it parses from +// a string instead of the input tokenizer. +//-------------------------------------------------------------------- int GetBus(char *astr, struct bus *wb) { char *colonptr, *brackstart, *brackend; int result, start, end; - if (wb == NULL) return; + if (wb == NULL) return 0; else { wb->start = -1; wb->end = -1; } - brackstart = strchr(astr, '['); if (brackstart != NULL) { brackend = strchr(astr, ']'); @@ -129,10 +339,10 @@ int GetBus(char *astr, struct bus *wb) } if (colonptr) result = sscanf(colonptr + 1, "%d", &end); - else { + else { result = 1; - end = start; // Single bit - } + end = start; // Single bit + } *brackend = ']'; if (result != 1) { Printf("Badly formed array notation \"%s\"\n", astr); @@ -370,10 +580,11 @@ extern void PopStack(struct cellstack **top); void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr, int blackbox) { - int cdnum = 1, rdnum = 1, i; + int cdnum = 1, rdnum = 1, i, ival; int warnings = 0, hasports, inlined_decls = 0, localcount = 1; - char devtype, in_module, in_comment, in_param; - char *eqptr, *parptr, *matchptr; + double dval; + char devtype, in_module, in_param; + char *eqptr, *matchptr; struct keyvalue *kvlist = NULL; char inst[256], model[256], instname[256], portname[256], pkey[256]; struct nlist *tp; @@ -383,33 +594,24 @@ void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr, model[255] = '\0'; instname[255] = '\0'; in_module = (char)0; - in_comment = (char)0; in_param = (char)0; while (!EndParseFile()) { - SkipTok(VLOG_DELIMITERS); /* get the next token */ + SkipTokComments(VLOG_DELIMITERS); /* get the next token */ if ((EndParseFile()) && (nexttok == NULL)) break; + else if (nexttok == NULL) + break; - /* Handle comment blocks */ - if (nexttok[0] == '/' && nexttok[1] == '*') { - in_comment = (char)1; - } - else if (nexttok[0] == '*' && nexttok[1] == '/') { - in_comment = (char)0; - continue; - } - if (in_comment == (char)1) continue; - - /* Handle comment lines */ - if (match(nexttok, "//")) - SkipNewLine(VLOG_DELIMITERS); + /* Ignore end-of-statement markers */ + else if (match(nexttok, ";")) + continue; /* Ignore primitive definitions */ else if (match(nexttok, "primitive")) { while (1) { SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); if (EndParseFile()) break; if (match(nexttok, "endprimitive")) { in_module = 0; @@ -505,54 +707,34 @@ void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr, /* definition, and those which declare everything */ /* inside the pin list. */ - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); // Check for parameters within #( ... ) if (match(nexttok, "#(")) { - SkipTok(VLOG_DELIMITERS); - while (match(nexttok, "//")) { - SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS); - } + SkipTokComments(VLOG_DELIMITERS); in_param = (char)1; } - else if (nexttok[0] == '(') { - if (match(nexttok, "(")) - SkipTok(VLOG_DELIMITERS); - else - nexttok++; - while (match(nexttok, "//")) { - SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS); - } + else if (match(nexttok, "(")) { + SkipTokComments(VLOG_DELIMITERS); } wb.start = wb.end = -1; - while ((nexttok != NULL) && (nexttok[0] != ';')) { + while ((nexttok != NULL) && !match(nexttok, ";")) { if (in_param) { - if (!strcmp(nexttok, ")")) { + if (match(nexttok, ")")) { in_param = (char)0; - SkipTok(VLOG_DELIMITERS); - if (strcmp(nexttok, "(")) { + SkipTokComments(VLOG_DELIMITERS); + if (!match(nexttok, "(")) { Fprintf(stderr, "Badly formed module block parameter list.\n"); goto skip_endmodule; } } - else if ((eqptr = strchr(nexttok, '=')) != NULL) { - double dval; - - *eqptr = '\0'; - /* In case the variable name is not followed by whitespace */ - if (eqptr > nexttok) strcpy(pkey, nexttok); - eqptr++; - - // Equal sign may be followed by whitespace, in which case - // the parameter value is the next token. - if (strlen(eqptr) == 0) { - SkipTok(VLOG_DELIMITERS); /* get the next token */ - eqptr = nexttok; - } + else if (match(nexttok, "=")) { + + // The parameter value is the next token. + SkipTokComments(VLOG_DELIMITERS); /* get the next token */ + eqptr = nexttok; // Try first as a double, otherwise it's a string // Double value's slop defaults to 1%. @@ -566,7 +748,7 @@ void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr, strcpy(pkey, nexttok); } } - else { + else if (!match(nexttok, ",")) { if (match(nexttok, ")")) break; // Ignore input, output, and inout keywords, and handle buses. @@ -579,8 +761,8 @@ void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr, if (!match(nexttok, "input") && !match(nexttok, "output") && !match(nexttok, "inout") && !match(nexttok, "real") && !match(nexttok, "logic") && !match(nexttok, "integer")) { - if (nexttok[0] == '[') { - if (GetBus(nexttok, &wb) != 0) { + if (match(nexttok, "[")) { + if (GetBusTok(&wb) != 0) { // Didn't parse as a bus, so wing it wb.start = wb.end = -1; Port(nexttok); @@ -603,21 +785,15 @@ void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr, wb.start = wb.end = -1; } else { - char *pptr; - - if ((pptr = strrchr(nexttok, ')')) != NULL) - *pptr = '\0'; Port(nexttok); - if (pptr != NULL) break; } } hasports = 1; } } } - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); if (nexttok == NULL) break; - while (match(nexttok, "//")) { SkipNewLine(VLOG_DELIMITERS); SkipTok(VLOG_DELIMITERS); } } SetClass((blackbox) ? CLASS_MODULE : CLASS_SUBCKT); @@ -638,7 +814,7 @@ skip_endmodule: while (1) { SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); if (EndParseFile()) break; if (match(nexttok, "endmodule")) { in_module = 0; @@ -649,10 +825,47 @@ skip_endmodule: } else if (match(nexttok, "input") || match(nexttok, "output") || match(nexttok, "inout")) { + struct bus wb; - // To be completed: Duplicate parsing of ports, except as statements - // and not in the module pin list. - SkipNewLine(VLOG_DELIMITERS); + // Parsing of ports as statements not in the module pin list. + wb.start = wb.end = -1; + while (1) { + SkipTokComments(VLOG_DELIMITERS); + if (EndParseFile()) break; + + if (match(nexttok, ";")) { + // End of statement + break; + } + else if (match(nexttok, "[")) { + if (GetBusTok(&wb) != 0) { + // Didn't parse as a bus, so wing it + wb.start = wb.end = -1; + Port(nexttok); + } + } + else if (!match(nexttok, ",")) { + if (wb.start != -1) { + if (wb.start > wb.end) { + for (i = wb.start; i >= wb.end; i--) { + sprintf(portname, "%s[%d]", nexttok, i); + Port(portname); + } + } + else { + for (i = wb.start; i <= wb.end; i++) { + sprintf(portname, "%s[%d]", nexttok, i); + Port(portname); + } + } + wb.start = wb.end = -1; + } + else { + Port(nexttok); + } + } + hasports = 1; + } } else if (match(nexttok, "endmodule")) { @@ -749,15 +962,33 @@ skip_endmodule: kl = NewProperty(); kl->key = strsave(nexttok); kl->idx = 0; - kl->type = PROP_STRING; - kl->slop.dval = 0.0; + kl->merge = MERGE_NONE; SkipTokNoNewline(VLOG_DELIMITERS); - if ((nexttok == NULL) || (nexttok[0] == '\0')) - // Let "`define X" be equivalent to "`define X 1" - kl->pdefault.string = strsave("1"); - else + if ((nexttok == NULL) || (nexttok[0] == '\0')) { + // Let "`define X" be equivalent to "`define X 1". Use integer value. + kl->type = PROP_INTEGER; + kl->pdefault.ival = 1; + kl->slop.ival = 0; + } + else if (ConvertStringToInteger(nexttok, &ival) == 1) { + /* Parameter parses as an integer */ + kl->type = PROP_INTEGER; + kl->pdefault.ival = ival; + kl->slop.ival = 0; // Exact match default + } + else if (ConvertStringToFloat(nexttok, &dval) == 1) { + /* Parameter parses as a floating-point number */ + kl->type = PROP_DOUBLE; + kl->pdefault.dval = dval; + kl->slop.dval = 0.01; // One percent default + } + else { + /* Treat the parameter as a string */ + kl->type = PROP_STRING; kl->pdefault.string = strsave(nexttok); + kl->slop.dval = 0.0; + } HashPtrInstall(kl->key, kl, &verilogdefs); } else if (match(nexttok, "localparam")) { @@ -776,9 +1007,23 @@ skip_endmodule: kl = NewProperty(); kl->key = strsave(nexttok); kl->idx = 0; - kl->type = PROP_STRING; - kl->slop.dval = 0.0; - kl->pdefault.string = strsave(eqptr + 1); + kl->merge = MERGE_NONE; + + if (ConvertStringToInteger(eqptr + 1, &ival) == 1) { + kl->type = PROP_INTEGER; + kl->slop.ival = 0; + kl->pdefault.ival = ival; + } + else if (ConvertStringToFloat(eqptr + 1, &dval) == 1) { + kl->type = PROP_DOUBLE; + kl->slop.dval = 0.01; + kl->pdefault.dval = dval; + } + else { + kl->type = PROP_STRING; + kl->slop.dval = 0.0; + kl->pdefault.string = strsave(eqptr + 1); + } HashPtrInstall(nexttok, kl, &verilogparams); } } @@ -802,11 +1047,9 @@ skip_endmodule: /* Skip to matching `endif */ while (1) { SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); if (EndParseFile()) break; - if (match(nexttok, "//")) - continue; - else if (match(nexttok, "`ifdef") || match(nexttok, "`ifndef")) { + if (match(nexttok, "`ifdef") || match(nexttok, "`ifndef")) { nested++; } else if (match(nexttok, "`endif")) { @@ -826,7 +1069,7 @@ skip_endmodule: if (match(nexttok, "real")) SkipTokNoNewline(VLOG_DELIMITERS); while (nexttok != NULL) { /* Handle bus notation */ - if (GetBus(nexttok, &wb) == 0) { + if (GetBusTok(&wb) == 0) { SkipTokNoNewline(VLOG_DELIMITERS); if (wb.start > wb.end) { for (i = wb.end; i <= wb.start; i++) { @@ -895,115 +1138,131 @@ skip_endmodule: head = NULL; tail = NULL; - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); - // Next token must be '#(' (parameters) or '(' (pin list) + // Next token must be '#(' (parameters) or an instance name - if (!strcmp(nexttok, "#(")) { + if (match(nexttok, "#(")) { // Read the parameter list + SkipTokComments(VLOG_DELIMITERS); while (nexttok != NULL) { char *paramname; - SkipTok(VLOG_DELIMITERS2); - while (match(nexttok, "//")) { - SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS2); - } - if (!strcasecmp(nexttok, ";")) { - SkipTok(VLOG_DELIMITERS); + if (match(nexttok, ")")) { + SkipTokComments(VLOG_DELIMITERS); break; } + else if (match(nexttok, ",")) { + SkipTokComments(VLOG_DELIMITERS); + continue; + } // We need to look for parameters of the type ".name(value)" - if (nexttok[0] != '.') break; - else { + else if (nexttok[0] == '.') { paramname = strsave(nexttok + 1); - SkipTok(VLOG_DELIMITERS2); - while (match(nexttok, "//")) { - SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS2); + SkipTokComments(VLOG_DELIMITERS); + if (!match(nexttok, "(")) { + Printf("Error: Expecting parameter value, got %s.\n", nexttok); + } + SkipTokComments(VLOG_DELIMITERS); + if (match(nexttok, ")")) { + Printf("Error: Parameter with no value found.\n"); + } + else { + AddProperty(&kvlist, paramname, nexttok); + SkipTokComments(VLOG_DELIMITERS); + if (!match(nexttok, ")")) { + Printf("Error: Expecting end of parameter value, " + "got %s.\n", nexttok); + } } - AddProperty(&kvlist, paramname, nexttok); FREE(paramname); } + SkipTokComments(VLOG_DELIMITERS); + } + if (!nexttok) { + Printf("Error: Still reading module, but got end-of-file.\n"); + goto skip_endmodule; } } - // Catch instance name followed by open parenthesis with no space - if ((parptr = strchr(nexttok, '(')) != NULL) *parptr = '\0'; - - // Then comes the instance name strncpy(instancename, nexttok, 99); - if (!parptr) - SkipTok(VLOG_DELIMITERS); - else { - *parptr = '('; - nexttok = parptr; - } /* Printf("Diagnostic: new instance is %s\n", instancename); */ - while (match(nexttok, "//")) { - SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS); - } + SkipTokComments(VLOG_DELIMITERS); arraystart = arrayend = -1; - if (nexttok[0] == '[') { + if (match(nexttok, "[")) { // Handle instance array notation. struct bus wb; - if (GetBus(nexttok, &wb) == 0) { + if (GetBusTok(&wb) == 0) { arraystart = wb.start; arrayend = wb.end; } - SkipTok(VLOG_DELIMITERS); + SkipTokComments(VLOG_DELIMITERS); } - if (nexttok[0] == '(') { + if (match(nexttok, "(")) { char savetok = (char)0; struct portelement *new_port; - // Note that the open parens does not necessarily have to be - // followed by space. - if (nexttok[1] != '\0') { - nexttok++; - savetok = (char)1; - } - // Read the pin list while (nexttok != NULL) { - if (savetok == (char)0) SkipTok(VLOG_DELIMITERS2); - savetok = (char)0; + SkipTokComments(VLOG_DELIMITERS); // NOTE: Deal with `ifdef et al. properly. Ignoring for now. - while (match(nexttok, "//") || (nexttok[0] == '`')) { + while (nexttok[0] == '`') { SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS2); + SkipTokComments(VLOG_DELIMITERS); } - if (!strcasecmp(nexttok, ";")) break; + if (match(nexttok, ")")) break; + else if (match(nexttok, ",")) continue; // We need to look for pins of the type ".name(value)" if (nexttok[0] != '.') { Printf("Badly formed subcircuit pin line at \"%s\"\n", nexttok); + SkipNewLine(VLOG_DELIMITERS); } else { new_port = (struct portelement *)CALLOC(1, sizeof(struct portelement)); new_port->name = strsave(nexttok + 1); - SkipTok(VLOG_DELIMITERS2); - while (match(nexttok, "//")) { - SkipNewLine(VLOG_DELIMITERS); - SkipTok(VLOG_DELIMITERS2); + SkipTokComments(VLOG_DELIMITERS); + if (!match(nexttok, "(")) { + Printf("Badly formed subcircuit pin line at \"%s\"\n", nexttok); + SkipNewLine(VLOG_DELIMITERS); } - if (match(nexttok, ";") || (nexttok[0] == '.')) { + SkipTokComments(VLOG_PIN_NAME_DELIMITERS); + if (match(nexttok, ")")) { char localnet[100]; // Empty parens, so create a new local node savetok = (char)1; sprintf(localnet, "_noconnect_%d_", localcount++); new_port->net = strsave(localnet); } - else + else { new_port->net = strsave(nexttok); + /* Read array information along with name; will be parsed later */ + SkipTokComments(VLOG_DELIMITERS); + if (match(nexttok, "[")) { + /* Check for space between name and array identifier */ + SkipTokComments(VLOG_PIN_NAME_DELIMITERS); + if (!match(nexttok, ")")) { + char *expnet; + expnet = (char *)MALLOC(strlen(new_port->net) + + strlen(nexttok) + 2); + sprintf(expnet, "%s[%s", new_port->net, nexttok); + FREE(new_port->net); + new_port->net = expnet; + } + SkipTokComments(VLOG_DELIMITERS); + } + if (!match(nexttok, ")")) { + Printf("Badly formed subcircuit pin line at \"%s\"\n", nexttok); + SkipNewLine(VLOG_DELIMITERS); + } + } if (head == NULL) head = new_port; else tail->next = new_port; @@ -1013,13 +1272,12 @@ skip_endmodule: } } else { - // There are too many statements in too many variants of verilog - // to track them all, let alone dealing with macro substitutions - // and such. If it doesn't look like a circuit instance and isn't - // otherwise handled above, treat as a non-structural statement - // and recast the device class as a black-box module. - SetClass(CLASS_MODULE); - goto skip_endmodule; + Printf("Expected to find instance pin block but got \"%s\"\n", nexttok); + } + /* Instance should end with a semicolon */ + SkipTokComments(VLOG_DELIMITERS); + if (!match(nexttok, ";")) { + Printf("Expected to find end of instance but got \"%s\"\n", nexttok); } /* Check for ignored class */ @@ -1131,9 +1389,61 @@ skip_endmodule: struct bus wb; struct portelement *new_port; char vname[256]; - int j; + int j, result; + struct objlist *bobj; + char *bptr; + int minnet, maxnet, testidx; + + result = GetBus(scan->net, &wb); + if (result == -1) { + /* CHECK: THIS CODE SHOULD BE DELETED, IT IS NOT THE ISSUE */ + /* Not bus notation, but check if signal was defined as a bus */ + wb.start = wb.end = -1; + minnet = maxnet = -1; + + /* Pins should be in index order start->end. Other nodes */ + /* should be in order start->end by node number. */ + + for (bobj = CurrentCell->cell; bobj; bobj = bobj->next) { + if (bobj->type == PORT) { + if ((bptr = strchr(bobj->name, '[')) != NULL) { + *bptr = '\0'; + if (!strcmp(bobj->name, scan->net)) { + *bptr = '['; + if (wb.start == -1) + sscanf(bptr + 1, "%d", &wb.start); + else + sscanf(bptr + 1, "%d", &wb.end); + } + } + } + else if (bobj->type == NODE) { + if ((bptr = strchr(bobj->name, '[')) != NULL) { + *bptr = '\0'; + if (!strcmp(bobj->name, scan->net)) { + if (sscanf(bptr + 1, "%d", &testidx) == 1) { + if (minnet == -1) { + minnet = maxnet = bobj->node; + wb.start = wb.end = testidx; + } + else if (bobj->node < minnet) { + minnet = bobj->node; + wb.start = testidx; + } + else if (bobj->node > maxnet) { + maxnet = bobj->node; + wb.end = testidx; + } + } + } + *bptr = '['; + } + } + } + if (wb.start != -1) result = 0; + } - if (GetBus(scan->net, &wb) == 0) { + if (result == 0) { if (((wb.start - wb.end) != (portstart - portend)) && ((wb.start - wb.end) != (portend - portstart))) { if (((wb.start - wb.end) != (arraystart - arrayend)) && @@ -1362,11 +1672,12 @@ char *ReadVerilogTop(char *fname, int *fnum, int blackbox) /* Add the pre-defined key "LVS" to verilogdefs */ kl = NewProperty(); + kl->merge = MERGE_NONE; kl->key = strsave("LVS"); kl->idx = 0; - kl->type = PROP_STRING; - kl->slop.dval = 0.0; - kl->pdefault.string = strsave("1"); + kl->type = PROP_INTEGER; + kl->slop.ival = 0; + kl->pdefault.ival = 1; HashPtrInstall(kl->key, kl, &verilogdefs); /* All verilog files should start with a comment line, */ diff --git a/doc/Makefile b/doc/Makefile index cd06b2d..bef3c29 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -8,9 +8,9 @@ DOCDIRS = $(DESTDIR)${DOCDIR} MANFILES = DOCFILES = $(DESTDIR)${DOCDIR}/netgen.doc -install-tcl: ${MANDIRS} ${MANFILES} ${DOCDIRS} ${DOCFILES} +install-tcl: ${DOCDIRS} ${DOCFILES} -install: ${MANDIRS} ${MANFILES} ${DOCDIRS} ${DOCFILES} +install: ${DOCDIRS} ${DOCFILES} ${MANDIRS}: make-man-dirs diff --git a/scripts/configure b/scripts/configure index e4e1a0d..c6d171b 100755 --- a/scripts/configure +++ b/scripts/configure @@ -7779,7 +7779,9 @@ else fi ${ECHO_N} "Python3: " -if test "x${HAVE_PYTHON3}" == "x"; then +if test "${HAVE_PYTHON3}" == "yes"; then + echo "yes" +else echo "no" echo echo " Without Python3, you cannot run the GUI interface to netgen." @@ -7788,8 +7790,6 @@ if test "x${HAVE_PYTHON3}" == "x"; then echo " python3 support, make sure that you have installed python3" echo " on your system." echo -else - echo "yes" fi echo "-----------------------------------------------------------" diff --git a/scripts/configure.in b/scripts/configure.in index 24080f2..2f951c2 100644 --- a/scripts/configure.in +++ b/scripts/configure.in @@ -1319,7 +1319,9 @@ else fi ${ECHO_N} "Python3: " -if test "x${HAVE_PYTHON3}" == "x"; then +if test "${HAVE_PYTHON3}" == "yes"; then + echo "yes" +else echo "no" echo echo " Without Python3, you cannot run the GUI interface to netgen." @@ -1328,8 +1330,6 @@ if test "x${HAVE_PYTHON3}" == "x"; then echo " python3 support, make sure that you have installed python3" echo " on your system." echo -else - echo "yes" fi echo "-----------------------------------------------------------" diff --git a/tcltk/netgen.tcl.in b/tcltk/netgen.tcl.in index 2b0a9cc..830be5e 100644 --- a/tcltk/netgen.tcl.in +++ b/tcltk/netgen.tcl.in @@ -138,7 +138,7 @@ proc netgen::convert_to_json {filename lvs_final} { foreach net $cktval { incr nidx puts $fjson " \[" - set netname [lindex $net 0] + set netname [string map {"\\" ""} [lindex $net 0]] puts $fjson " \"$netname\"," puts $fjson " \[" set netconn [lindex $net 1] @@ -169,7 +169,7 @@ proc netgen::convert_to_json {filename lvs_final} { foreach net $cktval { incr nidx puts $fjson " \[" - set netname [lindex $net 0] + set netname [string map {"\\" ""} [lindex $net 0]] puts $fjson " \"$netname\"," puts $fjson " \[" set netconn [lindex $net 1] diff --git a/tcltk/tclnetgen.c b/tcltk/tclnetgen.c index 6077480..8b21a19 100644 --- a/tcltk/tclnetgen.c +++ b/tcltk/tclnetgen.c @@ -3157,19 +3157,25 @@ _netcmp_equate(ClientData clientData, /* add --- add new property */ /* remove --- delete existing property */ /* tolerance --- set property tolerance */ -/* merge --- set property merge behavior */ +/* merge --- (deprecated) */ /* or */ /* netgen::property default */ /* or */ /* netgen::property <device>|<model> <option> */ /* yes|no */ /* Where <option> is one of: */ -/* serial --- allow/prohibit serial combination */ +/* series --- allow/prohibit series combination */ /* parallel --- allow/prohibit parallel combination */ /* or */ /* netgen::property parallel none */ /* --- prohibit parallel combinations by */ -/* default. */ +/* default (for all devices). */ +/* */ +/* series|parallel options are: */ +/* enable|disable|none|{<key> <combine_option>} */ +/* */ +/* combine options are: */ +/* par|add|par_critical|add_critical */ /* */ /* Formerly: (none) */ /* Results: */ @@ -3189,11 +3195,11 @@ _netcmp_property(ClientData clientData, char *options[] = { "add", "create", "remove", "delete", "tolerance", "merge", "serial", - "parallel", NULL + "series", "parallel", NULL }; enum OptionIdx { ADD_IDX, CREATE_IDX, REMOVE_IDX, DELETE_IDX, TOLERANCE_IDX, MERGE_IDX, - SERIAL_IDX, PARALLEL_IDX + SERIAL_IDX, SERIES_IDX, PARALLEL_IDX }; int result, index, idx2; @@ -3204,16 +3210,31 @@ _netcmp_property(ClientData clientData, INTEGER_IDX, DOUBLE_IDX, VALUE_IDX, STRING_IDX }; + /* Note: "merge" has been deprecated, but kept for backwards compatibility. */ + /* It has been replaced by "combineoptions" below, used with "series" and */ + /* "parallel". */ + char *mergeoptions[] = { "none", "add", "add_critical", "par", "par_critical", "parallel", "parallel_critical", "ser_critical", "ser", - "serial_critical", "serial", NULL + "serial_critical", "series_critical", "serial", "series", NULL }; + enum MergeOptionIdx { NONE_IDX, ADD_ONLY_IDX, ADD_CRIT_IDX, PAR_ONLY_IDX, PAR_CRIT_IDX, PAR2_ONLY_IDX, PAR2_CRIT_IDX, - SER_CRIT_IDX, SER_IDX, SER2_CRIT_IDX, SER2_IDX + SER_CRIT_IDX, SER_IDX, SER2_CRIT_IDX, SER3_CRIT_IDX, SER2_IDX, SER3_IDX + }; + + char *combineoptions[] = { + "none", "par", "add", "par_critical", "add_critical", NULL + }; + + enum CombineOptionIdx { + COMB_NONE_IDX, COMB_PAR_IDX, COMB_ADD_IDX, COMB_PAR_CRITICAL_IDX, + COMB_ADD_CRITICAL_IDX }; + char *yesno[] = { "on", "yes", "true", "enable", "allow", "off", "no", "false", "disable", "prohibit", NULL @@ -3238,25 +3259,34 @@ _netcmp_property(ClientData clientData, case CLASS_NMOS: case CLASS_PMOS: case CLASS_FET3: case CLASS_NMOS4: case CLASS_PMOS4: case CLASS_FET4: case CLASS_FET: - PropertyMerge(tp->name, tp->file, "w", MERGE_ADD_CRIT); + PropertyMerge(tp->name, tp->file, "w", MERGE_P_ADD | MERGE_P_CRIT, + MERGE_ALL_MASK); PropertyDelete(tp->name, tp->file, "as"); PropertyDelete(tp->name, tp->file, "ad"); PropertyDelete(tp->name, tp->file, "ps"); PropertyDelete(tp->name, tp->file, "pd"); break; case CLASS_RES: case CLASS_RES3: - PropertyMerge(tp->name, tp->file, "w", MERGE_ADD_CRIT); - PropertyMerge(tp->name, tp->file, "l", MERGE_SER_CRIT); - tp->flags |= COMB_SERIAL; + PropertyMerge(tp->name, tp->file, "w", + MERGE_P_PAR | MERGE_P_CRIT, MERGE_ALL_MASK); + PropertyMerge(tp->name, tp->file, "l", + MERGE_S_ADD | MERGE_S_CRIT, MERGE_ALL_MASK); + PropertyMerge(tp->name, tp->file, "value", + MERGE_S_ADD | MERGE_P_PAR, MERGE_ALL_MASK); + tp->flags |= COMB_SERIES; break; case CLASS_CAP: case CLASS_ECAP: case CLASS_CAP3: // NOTE: No attempt to combine area, width, or length; // only value. - PropertyMerge(tp->name, tp->file, "value", MERGE_ADD_CRIT); + PropertyMerge(tp->name, tp->file, "value", + MERGE_P_ADD | MERGE_P_CRIT | + MERGE_S_PAR | MERGE_S_CRIT, MERGE_ALL_MASK); break; case CLASS_INDUCTOR: - PropertyMerge(tp->name, tp->file, "value", MERGE_PAR_CRIT); - tp->flags |= COMB_SERIAL; + PropertyMerge(tp->name, tp->file, "value", + MERGE_P_PAR | MERGE_P_CRIT | + MERGE_S_PAR | MERGE_S_CRIT, MERGE_ALL_MASK); + tp->flags |= COMB_SERIES; break; } tp = NextCell(); @@ -3274,7 +3304,22 @@ _netcmp_property(ClientData clientData, } else { Tcl_SetResult(interp, "Bad option, should be property parallel none|all", - NONE); + NULL); + return TCL_ERROR; + } + return TCL_OK; + } + else if ((objc == 3) && ((!strcmp(Tcl_GetString(objv[1]), "series")) || + (!strcmp(Tcl_GetString(objv[1]), "serial")))) { + if (!strcmp(Tcl_GetString(objv[2]), "none")) { + SetSeriesCombine(FALSE); + } + else if (!strcmp(Tcl_GetString(objv[2]), "all")) { + SetSeriesCombine(TRUE); + } + else { + Tcl_SetResult(interp, "Bad option, should be property series none|all", + NULL); return TCL_ERROR; } return TCL_OK; @@ -3329,10 +3374,11 @@ _netcmp_property(ClientData clientData, switch (index) { case SERIAL_IDX: + case SERIES_IDX: case PARALLEL_IDX: if (objc == 3) { - if (index == SERIAL_IDX) { - tobj1 = Tcl_NewBooleanObj((tp->flags & COMB_SERIAL) ? 1 : 0); + if (index == SERIAL_IDX || index == SERIES_IDX) { + tobj1 = Tcl_NewBooleanObj((tp->flags & COMB_SERIES) ? 1 : 0); Tcl_SetObjResult(interp, tobj1); return TCL_OK; } @@ -3342,29 +3388,106 @@ _netcmp_property(ClientData clientData, return TCL_OK; } } - else if (objc == 4) { - if (Tcl_GetIndexFromObj(interp, objv[3], + else if (objc < 4) { + Tcl_WrongNumArgs(interp, 2, objv, "series|parallel enable|disable"); + return TCL_ERROR; + } + + for (i = 3; i < objc; i++) { + // Each value must be a list of two, or a yes/no answer. + + if (Tcl_GetIndexFromObj(interp, objv[i], (CONST84 char **)yesno, - "combine", 0, &idx2) != TCL_OK) { - Tcl_WrongNumArgs(interp, 3, objv, "enable|disable"); - return TCL_ERROR; - } - if (idx2 <= 4) { /* true, enable, etc. */ - if (index == SERIAL_IDX) - tp->flags |= COMB_SERIAL; - else - tp->flags &= ~COMB_NO_PARALLEL; + "combine", 0, &idx2) == TCL_OK) { + if (idx2 <= 4) { /* true, enable, etc. */ + if (index == SERIAL_IDX || index == SERIES_IDX) + tp->flags |= COMB_SERIES; + else + tp->flags &= ~COMB_NO_PARALLEL; + } + else { /* false, disable, etc. */ + if (index == SERIAL_IDX || index == SERIES_IDX) + tp->flags &= ~COMB_SERIES; + else + tp->flags |= COMB_NO_PARALLEL; + } + continue; } - else { /* false, disable, etc. */ - if (index == SERIAL_IDX) - tp->flags &= ~COMB_SERIAL; - else - tp->flags |= COMB_NO_PARALLEL; + + result = Tcl_ListObjLength(interp, objv[i], &llen); + if ((result != TCL_OK) || (llen != 2)) { + Tcl_SetResult(interp, "Not a {key merge_type} pair list.", + NULL); + } + else { + int mergeval = MERGE_NONE; + int mergemask = MERGE_NONE; + + result = Tcl_ListObjIndex(interp, objv[i], 0, &tobj1); + if (result != TCL_OK) return result; + result = Tcl_ListObjIndex(interp, objv[i], 1, &tobj2); + if (result != TCL_OK) return result; + + result = Tcl_GetIndexFromObj(interp, tobj2, + (CONST84 char **)combineoptions, + "combine_type", 0, &idx2); + if (result != TCL_OK) return result; + + if (index == SERIAL_IDX || index == SERIES_IDX) { + mergemask = MERGE_S_MASK; + switch (idx2) { + case COMB_NONE_IDX: + mergeval &= ~(MERGE_S_ADD | MERGE_S_PAR + | MERGE_S_CRIT); + tp->flags &= ~COMB_SERIES; + break; + case COMB_PAR_IDX: + mergeval = MERGE_S_PAR; + tp->flags |= COMB_SERIES; + break; + case COMB_ADD_IDX: + mergeval |= MERGE_S_ADD; + tp->flags |= COMB_SERIES; + break; + case COMB_PAR_CRITICAL_IDX: + mergeval |= (MERGE_S_PAR | MERGE_S_CRIT); + tp->flags |= COMB_SERIES; + break; + case COMB_ADD_CRITICAL_IDX: + mergeval |= (MERGE_S_ADD | MERGE_S_CRIT); + tp->flags |= COMB_SERIES; + break; + } + } + else { /* index == PARALLEL_IDX */ + mergemask = MERGE_P_MASK; + switch (idx2) { + case COMB_NONE_IDX: + mergeval &= ~(MERGE_P_ADD | MERGE_P_PAR + | MERGE_P_CRIT); + tp->flags |= COMB_NO_PARALLEL; + break; + case COMB_PAR_IDX: + mergeval |= MERGE_P_PAR; + tp->flags &= ~COMB_NO_PARALLEL; + break; + case COMB_ADD_IDX: + mergeval |= MERGE_P_ADD; + tp->flags &= ~COMB_NO_PARALLEL; + break; + case COMB_PAR_CRITICAL_IDX: + mergeval |= (MERGE_P_PAR | MERGE_P_CRIT); + tp->flags &= ~COMB_NO_PARALLEL; + break; + case COMB_ADD_CRITICAL_IDX: + mergeval |= (MERGE_P_ADD | MERGE_P_CRIT); + tp->flags &= ~COMB_NO_PARALLEL; + break; + } + } + PropertyMerge(tp->name, fnum, Tcl_GetString(tobj1), mergeval, + mergemask); } - } - else { - Tcl_WrongNumArgs(interp, 2, objv, "serial|parallel enable|disable"); - return TCL_ERROR; } break; @@ -3535,6 +3658,11 @@ _netcmp_property(ClientData clientData, break; case MERGE_IDX: + // NOTE: This command option is deprecated, kept for backwards + // compatibility, with updated flag values. This command format + // is unable to specify a property as being a critical property + // for merging both in series and in parallel. + if (objc == 3) { Tcl_WrongNumArgs(interp, 1, objv, "{property_key merge_type} ..."); return TCL_ERROR; @@ -3564,29 +3692,32 @@ _netcmp_property(ClientData clientData, mergeval = MERGE_NONE; break; case ADD_ONLY_IDX: - mergeval = MERGE_ADD; + mergeval = MERGE_P_ADD; break; case ADD_CRIT_IDX: - mergeval = MERGE_ADD_CRIT; + mergeval = MERGE_P_ADD | MERGE_P_CRIT; break; case PAR_ONLY_IDX: case PAR2_ONLY_IDX: - mergeval = MERGE_PAR; + mergeval = MERGE_P_PAR; break; case PAR_CRIT_IDX: case PAR2_CRIT_IDX: - mergeval = MERGE_PAR_CRIT; + mergeval = MERGE_P_PAR | MERGE_P_CRIT; break; case SER_CRIT_IDX: case SER2_CRIT_IDX: - mergeval = MERGE_SER_CRIT; + case SER3_CRIT_IDX: + mergeval = MERGE_S_ADD | MERGE_S_CRIT; break; case SER_IDX: case SER2_IDX: - mergeval = MERGE_SER; + case SER3_IDX: + mergeval = MERGE_S_ADD; break; } - PropertyMerge(tp->name, fnum, Tcl_GetString(tobj1), mergeval); + PropertyMerge(tp->name, fnum, Tcl_GetString(tobj1), mergeval, + MERGE_ALL_MASK); } } break; diff --git a/tcltk/tmp.out b/tcltk/tmp.out new file mode 100644 index 0000000..b0c8be9 --- /dev/null +++ b/tcltk/tmp.out @@ -0,0 +1,4405 @@ +*SPEF "IEEE 1481.1999" +*DESIGN "map9v3" +*DATE "08:50:32 Thursday October 04, 2018" +*VENDOR "unknown" +*PROGRAM "qrouter" +*VERSION "unknown" +*DESIGN_FLOW "qflow" +*DIVIDER / +*DELIMITER : +*BUS_DELIMITER __ +*T_UNIT 1 PS +*C_UNIT 1 FF +*R_UNIT 1 OHM +*L_UNIT 1 HENRY + +*NAME_MAP +*1 _91__test +*2 INVX4_1:Y +*3 OAI21X1_21:C +*4 NAND3X1_10:A +*5 NAND2X1_1:A +*6 NAND3X1_2:B +*7 OAI21X1_5:C +*8 OAI21X1_6:C +*9 OAI21X1_7:C +*10 OAI21X1_8:C +*11 OAI21X1_9:C +*12 OAI21X1_28:C +*13 OAI21X1_10:C +*14 OAI21X1_4:C +*15 OAI21X1_12:A +*16 OAI21X1_11:C +*17 OAI21X1_14:C +*18 AOI21X1_10:C +*19 state_state_0_ +*20 DFFSR_1:Q +*21 AOI22X1_1:A +*22 OAI21X1_18:C +*23 OAI21X1_16:A +*24 OAI21X1_13:C +*25 AOI21X1_11:C +*26 OAI22X1_1:C +*27 OAI21X1_25:A +*28 OAI21X1_23:C +*29 NAND3X1_8:A +*30 INVX4_1:A +*31 AOI21X1_13:C +*32 NAND2X1_7:A +*33 _103_ +*34 NAND3X1_2:Y +*35 MUX2X1_2:S +*36 MUX2X1_6:S +*37 MUX2X1_1:S +*38 MUX2X1_7:S +*39 AOI21X1_1:B +*40 NOR2X1_4:B +*41 NOR2X1_5:B +*42 AOI21X1_2:B +*43 MUX2X1_3:S +*44 MUX2X1_4:S +*45 MUX2X1_5:S +*46 clock_bF_buf4 +*47 CLKBUF1_1:Y +*48 DFFSR_30:CLK +*49 DFFSR_6:CLK +*50 DFFSR_31:CLK +*51 DFFSR_24:CLK +*52 DFFSR_14:CLK +*53 DFFSR_7:CLK +*54 DFFSR_8:CLK +*55 clock_bF_buf3 +*56 CLKBUF1_2:Y +*57 DFFSR_26:CLK +*58 DFFSR_27:CLK +*59 DFFSR_28:CLK +*60 DFFSR_29:CLK +*61 DFFSR_10:CLK +*62 DFFSR_11:CLK +*63 DFFSR_12:CLK +*64 _48__bF_buf4 +*65 BUFX4_1:Y +*66 DFFSR_9:R +*67 DFFSR_15:R +*68 DFFSR_22:R +*69 DFFSR_23:R +*70 DFFSR_21:R +*71 DFFSR_5:R +*72 DFFSR_3:R +*73 _48__bF_buf3 +*74 BUFX4_2:Y +*75 DFFSR_25:R +*76 DFFSR_2:R +*77 DFFSR_13:R +*78 DFFSR_30:R +*79 DFFSR_32:R +*80 DFFSR_8:R +*81 DFFSR_16:R +*82 state_3_ +*83 DFFSR_4:Q +*84 NAND3X1_3:A +*85 NAND3X1_9:A +*86 AOI22X1_2:A +*87 OAI21X1_1:C +*88 INVX8_1:A +*89 OAI21X1_3:C +*90 OAI21X1_4:A +*91 clock_bF_buf2 +*92 CLKBUF1_3:Y +*93 DFFSR_13:CLK +*94 DFFSR_2:CLK +*95 DFFSR_25:CLK +*96 DFFSR_32:CLK +*97 DFFSR_17:CLK +*98 DFFSR_16:CLK +*99 clock_bF_buf1 +*100 CLKBUF1_4:Y +*101 DFFSR_15:CLK +*102 DFFSR_23:CLK +*103 DFFSR_22:CLK +*104 DFFSR_21:CLK +*105 DFFSR_9:CLK +*106 DFFSR_3:CLK +*107 clock_bF_buf0 +*108 CLKBUF1_5:Y +*109 DFFSR_5:CLK +*110 DFFSR_4:CLK +*111 DFFSR_20:CLK +*112 DFFSR_19:CLK +*113 DFFSR_18:CLK +*114 DFFSR_1:CLK +*115 _48__bF_buf2 +*116 BUFX4_3:Y +*117 DFFSR_29:R +*118 DFFSR_6:R +*119 DFFSR_31:R +*120 DFFSR_24:R +*121 DFFSR_14:R +*122 DFFSR_7:R +*123 _48__bF_buf1 +*124 BUFX4_4:Y +*125 DFFSR_27:R +*126 DFFSR_26:R +*127 DFFSR_28:R +*128 DFFSR_10:R +*129 DFFSR_11:R +*130 DFFSR_12:R +*131 _48__bF_buf0 +*132 BUFX4_5:Y +*133 DFFSR_1:S +*134 DFFSR_17:R +*135 DFFSR_18:R +*136 DFFSR_19:R +*137 DFFSR_20:R +*138 DFFSR_4:R +*139 clock +*140 CLKBUF1_4:A +*141 CLKBUF1_5:A +*142 CLKBUF1_3:A +*143 CLKBUF1_2:A +*144 CLKBUF1_1:A +*145 _48_ +*146 INVX8_2:Y +*147 BUFX4_4:A +*148 BUFX4_1:A +*149 BUFX4_3:A +*150 BUFX4_2:A +*151 BUFX4_5:A +*152 _102__bF_buf3 +*153 BUFX4_6:Y +*154 AOI21X1_8:A +*155 AOI21X1_14:A +*156 OAI21X1_28:B +*157 OAI21X1_10:B +*158 AOI21X1_9:A +*159 _102__bF_buf2 +*160 BUFX4_7:Y +*161 OAI21X1_7:B +*162 AOI21X1_6:A +*163 OAI21X1_9:B +*164 OAI21X1_8:B +*165 AOI21X1_7:A +*166 _102__bF_buf1 +*167 BUFX4_8:Y +*168 NAND3X1_2:C +*169 NAND3X1_11:B +*170 OAI21X1_27:A +*171 AND2X2_1:A +*172 NOR2X1_7:B +*173 _111__5_ +*174 DFFSR_21:Q +*175 BUFX2_6:A +*176 INVX1_28:A +*177 NOR3X1_2:A +*178 NOR3X1_1:A +*179 OAI21X1_20:C +*180 _111__4_ +*181 DFFSR_20:Q +*182 NOR3X1_1:B +*183 NOR3X1_2:B +*184 INVX2_2:A +*185 BUFX2_5:A +*186 OAI21X1_20:A +*187 _49_ +*188 NAND3X1_3:Y +*189 XNOR2X1_4:A +*190 AOI22X1_1:C +*191 NOR3X1_2:C +*192 OAI21X1_20:B +*193 INVX1_30:A +*194 _102_ +*195 INVX8_1:Y +*196 BUFX4_9:A +*197 BUFX4_7:A +*198 BUFX4_6:A +*199 BUFX4_8:A +*200 _102__bF_buf0 +*201 BUFX4_9:Y +*202 OAI21X1_5:B +*203 AOI21X1_4:A +*204 OAI21X1_6:B +*205 AOI21X1_5:A +*206 _111__2_ +*207 DFFSR_18:Q +*208 XNOR2X1_3:B +*209 INVX1_22:A +*210 BUFX2_3:A +*211 NOR2X1_1:B +*212 _111__0_ +*213 DFFSR_16:Q +*214 BUFX2_1:A +*215 AND2X2_1:B +*216 NOR2X1_7:A +*217 NOR2X1_2:B +*218 _111__6_ +*219 DFFSR_22:Q +*220 BUFX2_7:A +*221 AOI22X1_2:C +*222 INVX1_29:A +*223 NOR3X1_1:C +*224 _111__7_ +*225 DFFSR_23:Q +*226 BUFX2_8:A +*227 INVX1_32:A +*228 OAI21X1_27:C +*229 OAI21X1_1:A +*230 _114__0_ +*231 DFFSR_24:Q +*232 BUFX2_19:A +*233 NOR2X1_4:A +*234 OAI21X1_4:B +*235 OAI21X1_28:A +*236 _114__3_ +*237 DFFSR_27:Q +*238 INVX1_10:A +*239 BUFX2_22:A +*240 OAI21X1_7:A +*241 XNOR2X1_2:A +*242 _114__4_ +*243 DFFSR_28:Q +*244 INVX1_12:A +*245 OAI21X1_8:A +*246 XNOR2X1_2:B +*247 BUFX2_23:A +*248 _114__5_ +*249 DFFSR_29:Q +*250 OAI21X1_9:A +*251 INVX1_14:A +*252 XNOR2X1_1:A +*253 BUFX2_24:A +*254 _34_ +*255 NAND2X1_2:Y +*256 INVX2_1:A +*257 NAND2X1_4:A +*258 AOI21X1_12:B +*259 NAND3X1_4:A +*260 _35_ +*261 INVX2_1:Y +*262 OAI21X1_13:B +*263 OAI21X1_15:B +*264 AOI21X1_10:A +*265 OAI21X1_17:B +*266 N_3_ +*267 OAI21X1_17:A +*268 AOI21X1_10:B +*269 OAI21X1_15:A +*270 NOR2X1_10:A +*271 N_5_ +*272 OAI21X1_18:A +*273 INVX1_23:A +*274 OAI21X1_19:A +*275 NOR2X1_11:A +*276 _111__3_ +*277 DFFSR_19:Q +*278 NOR2X1_1:A +*279 AOI21X1_11:B +*280 BUFX2_4:A +*281 _92_ +*282 NOR2X1_1:Y +*283 NAND3X1_3:B +*284 NAND2X1_8:A +*285 NAND3X1_1:A +*286 _111__1_ +*287 DFFSR_17:Q +*288 BUFX2_2:A +*289 NOR2X1_2:A +*290 INVX1_21:A +*291 _93_ +*292 NOR2X1_2:Y +*293 NAND3X1_1:B +*294 NAND2X1_8:B +*295 NAND3X1_3:C +*296 state_2_ +*297 DFFSR_3:Q +*298 NAND3X1_2:A +*299 INVX1_34:A +*300 DFFSR_5:D +*301 _114__1_ +*302 DFFSR_25:Q +*303 INVX1_6:A +*304 OAI21X1_5:A +*305 BUFX2_20:A +*306 _114__2_ +*307 DFFSR_26:Q +*308 INVX1_8:A +*309 BUFX2_21:A +*310 OAI21X1_6:A +*311 _114__6_ +*312 DFFSR_30:Q +*313 OAI21X1_10:A +*314 INVX1_16:A +*315 BUFX2_25:A +*316 _114__7_ +*317 DFFSR_31:Q +*318 XNOR2X1_1:B +*319 INVX1_18:A +*320 BUFX2_26:A +*321 N_1_ +*322 NAND2X1_2:A +*323 NOR2X1_8:A +*324 INVX1_20:A +*325 _31_ +*326 NOR2X1_7:Y +*327 OAI21X1_11:A +*328 NOR2X1_9:B +*329 AND2X2_2:A +*330 _38_ +*331 AND2X2_2:Y +*332 OAI21X1_14:B +*333 NAND2X1_6:B +*334 XNOR2X1_3:A +*335 _44_ +*336 NOR2X1_10:Y +*337 NAND2X1_4:B +*338 NAND3X1_4:B +*339 AOI21X1_12:A +*340 _45_ +*341 NAND2X1_4:Y +*342 OAI21X1_19:B +*343 OAI21X1_18:B +*344 NAND2X1_5:A +*345 _56_ +*346 INVX2_2:Y +*347 NAND3X1_6:B +*348 NAND3X1_5:B +*349 XNOR2X1_4:B +*350 _59_ +*351 NAND3X1_4:Y +*352 OAI21X1_26:B +*353 OAI21X1_23:B +*354 INVX1_24:A +*355 _60_ +*356 INVX1_24:Y +*357 NAND3X1_7:C +*358 OAI21X1_24:B +*359 OAI21X1_22:A +*360 N_7_ +*361 OAI21X1_23:A +*362 INVX1_26:A +*363 OAI21X1_26:A +*364 _95_ +*365 NAND3X1_1:Y +*366 OAI21X1_27:B +*367 OAI21X1_1:B +*368 state_1_ +*369 DFFSR_2:Q +*370 AND2X2_4:B +*371 INVX1_1:A +*372 state_4_ +*373 DFFSR_5:Q +*374 NAND3X1_11:A +*375 INVX1_2:A +*376 start +*377 DFFSR_32:D +*378 INVX1_3:A +*379 _100_ +*380 NOR2X1_3:Y +*381 OAI21X1_2:B +*382 AND2X2_4:A +*383 _113__1_ +*384 DFFSR_7:Q +*385 BUFX2_11:A +*386 INVX1_4:A +*387 _113__2_ +*388 DFFSR_8:Q +*389 BUFX2_12:A +*390 INVX1_5:A +*391 _106_ +*392 INVX1_6:Y +*393 MUX2X1_1:B +*394 AOI21X1_14:B +*395 _113__3_ +*396 DFFSR_9:Q +*397 BUFX2_13:A +*398 INVX1_7:A +*399 _108_ +*400 INVX1_8:Y +*401 MUX2X1_2:B +*402 AOI21X1_4:B +*403 _113__4_ +*404 DFFSR_10:Q +*405 BUFX2_14:A +*406 INVX1_9:A +*407 _110_ +*408 INVX1_10:Y +*409 MUX2X1_3:B +*410 AOI21X1_5:B +*411 _113__5_ +*412 DFFSR_11:Q +*413 BUFX2_15:A +*414 INVX1_11:A +*415 _9_ +*416 INVX1_12:Y +*417 MUX2X1_4:B +*418 AOI21X1_6:B +*419 _113__6_ +*420 DFFSR_12:Q +*421 BUFX2_16:A +*422 INVX1_13:A +*423 _11_ +*424 INVX1_14:Y +*425 AOI21X1_7:B +*426 MUX2X1_5:B +*427 _113__7_ +*428 DFFSR_13:Q +*429 INVX1_15:A +*430 BUFX2_17:A +*431 _13_ +*432 INVX1_16:Y +*433 AOI21X1_8:B +*434 MUX2X1_6:B +*435 _113__8_ +*436 DFFSR_14:Q +*437 INVX1_17:A +*438 BUFX2_18:A +*439 _15_ +*440 INVX1_18:Y +*441 AOI21X1_9:B +*442 MUX2X1_7:B +*443 _113__0_ +*444 DFFSR_6:Q +*445 BUFX2_10:A +*446 INVX1_19:A +*447 _18_ +*448 XNOR2X1_1:Y +*449 AOI21X1_3:A +*450 OAI21X1_3:A +*451 _19_ +*452 XNOR2X1_2:Y +*453 OAI21X1_3:B +*454 AOI21X1_3:B +*455 N_2_ +*456 NAND2X1_2:B +*457 NOR2X1_8:B +*458 _37_ +*459 INVX1_21:Y +*460 AND2X2_2:B +*461 NOR2X1_9:A +*462 N_4_ +*463 OAI21X1_17:C +*464 NOR2X1_10:B +*465 N_6_ +*466 NOR2X1_11:B +*467 OAI21X1_19:C +*468 _67_ +*469 INVX1_26:Y +*470 NAND3X1_7:A +*471 OAI21X1_24:A +*472 _72_ +*473 INVX1_28:Y +*474 NAND3X1_6:A +*475 NAND3X1_5:A +*476 _75_ +*477 NOR2X1_12:Y +*478 NAND3X1_9:C +*479 AOI22X1_2:B +*480 N_8_ +*481 INVX1_31:A +*482 NAND3X1_7:B +*483 _84_ +*484 NAND3X1_9:Y +*485 NAND3X1_10:C +*486 INVX1_35:A +*487 _112_ +*488 DFFSR_15:Q +*489 INVX1_33:A +*490 BUFX2_9:A +*491 _94_ +*492 NOR3X1_1:Y +*493 NAND3X1_1:C +*494 _96_ +*495 OAI21X1_1:Y +*496 NAND2X1_1:B +*497 _6_ +*498 NAND2X1_1:Y +*499 DFFSR_4:D +*500 _97_ +*501 INVX1_1:Y +*502 OAI21X1_2:A +*503 _98_ +*504 INVX1_2:Y +*505 OAI21X1_2:C +*506 _99_ +*507 INVX1_3:Y +*508 NOR2X1_3:B +*509 startbuf +*510 DFFSR_32:Q +*511 NOR2X1_3:A +*512 _7_ +*513 OAI21X1_2:Y +*514 DFFSR_2:D +*515 _101_ +*516 INVX1_4:Y +*517 AOI21X1_1:A +*518 _104_ +*519 NOR2X1_4:Y +*520 AOI21X1_1:C +*521 _2__1_ +*522 AOI21X1_1:Y +*523 DFFSR_7:D +*524 _105_ +*525 INVX1_5:Y +*526 MUX2X1_1:A +*527 _2__2_ +*528 MUX2X1_1:Y +*529 DFFSR_8:D +*530 _107_ +*531 INVX1_7:Y +*532 MUX2X1_2:A +*533 _2__3_ +*534 MUX2X1_2:Y +*535 DFFSR_9:D +*536 _109_ +*537 INVX1_9:Y +*538 MUX2X1_3:A +*539 _2__4_ +*540 MUX2X1_3:Y +*541 DFFSR_10:D +*542 _8_ +*543 INVX1_11:Y +*544 MUX2X1_4:A +*545 _2__5_ +*546 MUX2X1_4:Y +*547 DFFSR_11:D +*548 _10_ +*549 INVX1_13:Y +*550 MUX2X1_5:A +*551 _2__6_ +*552 MUX2X1_5:Y +*553 DFFSR_12:D +*554 _12_ +*555 INVX1_15:Y +*556 MUX2X1_6:A +*557 _2__7_ +*558 MUX2X1_6:Y +*559 DFFSR_13:D +*560 _14_ +*561 INVX1_17:Y +*562 MUX2X1_7:A +*563 _2__8_ +*564 MUX2X1_7:Y +*565 DFFSR_14:D +*566 _16_ +*567 INVX1_19:Y +*568 AOI21X1_2:A +*569 N_0_ +*570 NOR2X1_5:A +*571 _17_ +*572 NOR2X1_5:Y +*573 AOI21X1_2:C +*574 _2__0_ +*575 AOI21X1_2:Y +*576 DFFSR_6:D +*577 _20_ +*578 OAI21X1_3:Y +*579 AOI21X1_3:C +*580 _21_ +*581 AOI21X1_3:Y +*582 NOR2X1_6:B +*583 _22_ +*584 OAI21X1_4:Y +*585 NOR2X1_6:A +*586 _3__0_ +*587 NOR2X1_6:Y +*588 DFFSR_24:D +*589 _23_ +*590 OAI21X1_5:Y +*591 AOI21X1_4:C +*592 _3__2_ +*593 AOI21X1_4:Y +*594 DFFSR_26:D +*595 _24_ +*596 OAI21X1_6:Y +*597 AOI21X1_5:C +*598 _3__3_ +*599 AOI21X1_5:Y +*600 DFFSR_27:D +*601 _25_ +*602 OAI21X1_7:Y +*603 AOI21X1_6:C +*604 _3__4_ +*605 AOI21X1_6:Y +*606 DFFSR_28:D +*607 _26_ +*608 OAI21X1_8:Y +*609 AOI21X1_7:C +*610 _3__5_ +*611 AOI21X1_7:Y +*612 DFFSR_29:D +*613 _27_ +*614 OAI21X1_9:Y +*615 AOI21X1_8:C +*616 _3__6_ +*617 AOI21X1_8:Y +*618 DFFSR_30:D +*619 _28_ +*620 OAI21X1_10:Y +*621 AOI21X1_9:C +*622 _3__7_ +*623 AOI21X1_9:Y +*624 DFFSR_31:D +*625 _29_ +*626 INVX1_20:Y +*627 OAI21X1_12:B +*628 _30_ +*629 AND2X2_1:Y +*630 OAI21X1_11:B +*631 _32_ +*632 OAI21X1_11:Y +*633 OAI21X1_12:C +*634 _0__0_ +*635 OAI21X1_12:Y +*636 DFFSR_16:D +*637 _33_ +*638 NOR2X1_8:Y +*639 OAI21X1_13:A +*640 _36_ +*641 OAI21X1_13:Y +*642 NAND2X1_3:A +*643 _39_ +*644 NOR2X1_9:Y +*645 OAI21X1_14:A +*646 _40_ +*647 OAI21X1_14:Y +*648 NAND2X1_3:B +*649 _0__1_ +*650 NAND2X1_3:Y +*651 DFFSR_17:D +*652 _41_ +*653 AOI21X1_10:Y +*654 OAI21X1_15:C +*655 _42_ +*656 OAI21X1_15:Y +*657 OAI21X1_16:C +*658 _43_ +*659 XNOR2X1_3:Y +*660 OAI21X1_16:B +*661 _0__2_ +*662 OAI21X1_16:Y +*663 DFFSR_18:D +*664 _46_ +*665 OAI21X1_17:Y +*666 NAND2X1_5:B +*667 _47_ +*668 NAND2X1_5:Y +*669 AOI22X1_1:B +*670 _50_ +*671 INVX1_22:Y +*672 NAND2X1_6:A +*673 _51_ +*674 NAND2X1_6:Y +*675 AOI21X1_11:A +*676 _52_ +*677 AOI21X1_11:Y +*678 AOI22X1_1:D +*679 _0__3_ +*680 AOI22X1_1:Y +*681 DFFSR_19:D +*682 _53_ +*683 INVX1_23:Y +*684 AOI21X1_12:C +*685 _54_ +*686 AOI21X1_12:Y +*687 OAI22X1_1:A +*688 _55_ +*689 OAI21X1_18:Y +*690 OAI22X1_1:B +*691 _57_ +*692 XNOR2X1_4:Y +*693 OAI22X1_1:D +*694 _0__4_ +*695 OAI22X1_1:Y +*696 DFFSR_20:D +*697 _58_ +*698 NOR2X1_11:Y +*699 NAND3X1_4:C +*700 _61_ +*701 OAI21X1_19:Y +*702 NAND2X1_7:B +*703 _62_ +*704 NAND2X1_7:Y +*705 OAI21X1_22:B +*706 _63_ +*707 NOR3X1_2:Y +*708 OAI21X1_21:A +*709 _64_ +*710 OAI21X1_20:Y +*711 INVX1_25:A +*712 _65_ +*713 INVX1_25:Y +*714 OAI21X1_21:B +*715 _66_ +*716 OAI21X1_21:Y +*717 OAI21X1_22:C +*718 _0__5_ +*719 OAI21X1_22:Y +*720 DFFSR_21:D +*721 _68_ +*722 OAI21X1_23:Y +*723 INVX1_27:A +*724 _69_ +*725 INVX1_27:Y +*726 OAI21X1_24:C +*727 _70_ +*728 OAI21X1_24:Y +*729 OAI21X1_25:C +*730 _71_ +*731 NAND2X1_8:Y +*732 NOR2X1_12:B +*733 _73_ +*734 INVX1_29:Y +*735 NAND3X1_5:C +*736 _74_ +*737 NAND3X1_5:Y +*738 NOR2X1_12:A +*739 _76_ +*740 INVX1_30:Y +*741 NAND3X1_6:C +*742 _77_ +*743 NAND3X1_6:Y +*744 AOI22X1_2:D +*745 _78_ +*746 AOI22X1_2:Y +*747 OAI21X1_25:B +*748 _0__6_ +*749 OAI21X1_25:Y +*750 DFFSR_22:D +*751 _79_ +*752 INVX1_31:Y +*753 OAI21X1_26:C +*754 _80_ +*755 OAI21X1_26:Y +*756 NAND3X1_8:B +*757 _81_ +*758 NAND3X1_7:Y +*759 NAND3X1_8:C +*760 _82_ +*761 NAND3X1_8:Y +*762 AND2X2_3:B +*763 _83_ +*764 INVX1_32:Y +*765 NAND3X1_9:B +*766 _85_ +*767 OAI21X1_27:Y +*768 NAND3X1_10:B +*769 _86_ +*770 NAND3X1_10:Y +*771 AND2X2_3:A +*772 _0__7_ +*773 AND2X2_3:Y +*774 DFFSR_23:D +*775 _87_ +*776 INVX1_33:Y +*777 AOI21X1_13:B +*778 _88_ +*779 INVX1_34:Y +*780 NAND3X1_11:C +*781 _89_ +*782 NAND3X1_11:Y +*783 AOI21X1_13:A +*784 _1_ +*785 AOI21X1_13:Y +*786 DFFSR_15:D +*787 _90_ +*788 OAI21X1_28:Y +*789 AOI21X1_14:C +*790 _3__1_ +*791 AOI21X1_14:Y +*792 DFFSR_25:D +*793 _4_ +*794 AND2X2_4:Y +*795 DFFSR_1:D +*796 _5_ +*797 INVX1_35:Y +*798 DFFSR_3:D +*799 reset +*800 INVX8_2:A +*801 counter_0_ +*802 BUFX2_1:Y +*803 counter_1_ +*804 BUFX2_2:Y +*805 counter_2_ +*806 BUFX2_3:Y +*807 counter_3_ +*808 BUFX2_4:Y +*809 counter_4_ +*810 BUFX2_5:Y +*811 counter_5_ +*812 BUFX2_6:Y +*813 counter_6_ +*814 BUFX2_7:Y +*815 counter_7_ +*816 BUFX2_8:Y +*817 done +*818 BUFX2_9:Y +*819 dp_0_ +*820 BUFX2_10:Y +*821 dp_1_ +*822 BUFX2_11:Y +*823 dp_2_ +*824 BUFX2_12:Y +*825 dp_3_ +*826 BUFX2_13:Y +*827 dp_4_ +*828 BUFX2_14:Y +*829 dp_5_ +*830 BUFX2_15:Y +*831 dp_6_ +*832 BUFX2_16:Y +*833 dp_7_ +*834 BUFX2_17:Y +*835 dp_8_ +*836 BUFX2_18:Y +*837 sr_0_ +*838 BUFX2_19:Y +*839 sr_1_ +*840 BUFX2_20:Y +*841 sr_2_ +*842 BUFX2_21:Y +*843 sr_3_ +*844 BUFX2_22:Y +*845 sr_4_ +*846 BUFX2_23:Y +*847 sr_5_ +*848 BUFX2_24:Y +*849 sr_6_ +*850 BUFX2_25:Y +*851 sr_7_ +*852 BUFX2_26:Y + +*PORTS +*139 I +*266 I +*271 I +*321 I +*360 I +*376 I +*455 I +*462 I +*465 I +*480 I +*569 I +*799 I +*801 O +*803 O +*805 O +*807 O +*809 O +*811 O +*813 O +*815 O +*817 O +*819 O +*821 O +*823 O +*825 O +*827 O +*829 O +*831 O +*833 O +*835 O +*837 O +*839 O +*841 O +*843 O +*845 O +*847 O +*849 O +*851 O + +*D_NET *1 0.00453096 +*CONN +*I *2 O *D INVX4 +*I *3 I *L 0.0180101 +*I *4 I *L 0.0222511 +*I *5 I *L 0.0177118 +*I *6 I *L 0.022204 +*I *7 I *L 0.0180101 +*I *8 I *L 0.0180101 +*I *9 I *L 0.0180101 +*I *10 I *L 0.0180101 +*I *11 I *L 0.0180101 +*I *12 I *L 0.0180101 +*I *13 I *L 0.0180101 +*I *14 I *L 0.0180101 +*I *15 I *L 0.0265312 +*I *16 I *L 0.0180101 +*I *17 I *L 0.0180101 +*I *18 I *L 0.02277 +*CAP +1 1_1 0.00018864 +2 1_2 4.896e-05 +3 1_3 0.00011424 +4 1_4 6.12e-05 +5 1_5 0.0001584 +6 1_6 0.000132 +7 1_7 0.00021504 +8 1_8 6.12e-05 +9 1_9 4.032e-05 +10 1_10 0.00013536 +11 1_11 0.00013824 +12 1_12 0 +13 1_13 0.00028464 +14 1_14 0.00020184 +15 1_15 4.08e-05 +16 1_16 2.04e-05 +17 1_17 0.00033216 +18 1_18 0.0001836 +19 1_19 2.04e-05 +20 1_20 0.00051624 +21 1_21 3.264e-05 +22 1_22 6.048e-05 +23 1_23 0 +24 1_24 0.00037152 +25 1_25 0.0004824 +26 1_26 2.04e-05 +27 1_27 0.00013536 +28 1_28 2.04e-05 +29 1_29 0.00022176 +30 1_30 0 +31 1_31 0.00029232 +*RES +1 *2 1_1 1.77333 +2 1_1 1_2 0.76 +3 1_2 *3 0 +4 1_1 1_3 3.17333 +5 1_3 1_4 0.7 +6 1_4 *4 0 +7 1_3 1_5 3.2 +8 1_5 1_6 1.8 +9 1_6 *5 0 +10 1_5 1_7 5.97333 +11 1_7 1_8 0.7 +12 1_8 *6 0 +13 1_7 1_9 1.12 +14 1_9 1_10 1.36 +15 1_10 1_11 1.24 +16 1_11 1_12 0 +17 1_12 *7 0 +18 1_12 1_13 4.57333 +19 1_13 *8 0 +20 1_10 1_14 5.27333 +21 1_14 1_15 0.466667 +22 1_15 1_16 0.233333 +23 1_16 *9 0 +24 1_16 1_17 5.22667 +25 1_17 *10 0 +26 1_14 1_18 2.1 +27 1_18 1_19 0.233333 +28 1_19 *11 0 +29 1_19 1_20 6.67333 +30 1_20 1_21 0.373333 +31 1_21 *12 0 +32 1_20 1_22 1.68 +33 1_22 1_23 0 +34 1_23 *13 0 +35 1_22 1_24 4.48 +36 1_24 *14 0 +37 1_9 1_25 3.53333 +38 1_25 1_26 0.233333 +39 1_26 *15 0 +40 1_26 1_27 2.42667 +41 1_27 1_28 0.233333 +42 1_28 *16 0 +43 1_28 1_29 6.16 +44 1_29 1_30 0 +45 1_30 *17 0 +46 1_29 1_31 5.85333 +47 1_31 *18 0 +*END +*D_NET *19 0.0025632 +*CONN +*I *20 O *D DFFSR +*I *21 I *L 0.0265618 +*I *22 I *L 0.0180101 +*I *23 I *L 0.0265312 +*I *24 I *L 0.0180101 +*I *25 I *L 0.02277 +*I *26 I *L 0.026839 +*I *27 I *L 0.0265312 +*I *28 I *L 0.0180101 +*I *29 I *L 0.0222511 +*I *30 I *L 0.0548793 +*I *31 I *L 0.02277 +*I *32 I *L 0.0177118 +*CAP +1 19_1 0.0002352 +2 19_2 0 +3 19_3 3.36e-05 +4 19_4 8.4e-06 +5 19_5 4.08e-05 +6 19_6 2.04e-05 +7 19_7 0.0003192 +8 19_8 4.08e-05 +9 19_9 0.0001224 +10 19_10 0.00011424 +11 19_11 0.00010752 +12 19_12 0.00023664 +13 19_13 0 +14 19_14 0.00028128 +15 19_15 2.04e-05 +16 19_16 0.0002448 +17 19_17 6.744e-05 +18 19_18 2.688e-05 +19 19_19 0.00013704 +20 19_20 0 +21 19_21 8.808e-05 +22 19_22 0.00034368 +23 19_23 7.44e-05 +*RES +1 *20 19_1 6.53333 +2 19_1 19_2 0 +3 19_2 *21 0 +4 19_2 19_3 0.933333 +5 19_3 19_4 0.233333 +6 19_4 19_5 0.466667 +7 19_5 19_6 0.233333 +8 19_6 *22 0 +9 19_6 19_7 4.2 +10 19_7 19_8 0.466667 +11 19_8 *23 0 +12 19_7 19_9 1.4 +13 19_9 19_10 1.30667 +14 19_10 *24 0 +15 19_9 19_11 2.98667 +16 19_11 *25 0 +17 19_4 19_12 2.70667 +18 19_12 19_13 0 +19 19_13 *26 0 +20 19_13 19_14 2.88 +21 19_14 19_15 0.233333 +22 19_15 *27 0 +23 19_15 19_16 2.8 +24 19_16 19_17 1.54 +25 19_17 19_18 0.746667 +26 19_18 *28 0 +27 19_17 19_19 1.40667 +28 19_19 19_20 0 +29 19_20 *29 0 +30 19_20 19_21 1.44667 +31 19_21 *30 0 +32 19_16 19_22 8.21333 +33 19_22 *31 0 +34 19_4 19_23 1.4 +35 19_23 *32 0 +*END +*D_NET *33 0.00306864 +*CONN +*I *34 O *D NAND3X1 +*I *35 I *L 0.0295792 +*I *36 I *L 0.0295792 +*I *37 I *L 0.0295792 +*I *38 I *L 0.0295792 +*I *39 I *L 0.0268633 +*I *40 I *L 0.0227534 +*I *41 I *L 0.0227534 +*I *42 I *L 0.0268633 +*I *43 I *L 0.0295792 +*I *44 I *L 0.0295792 +*I *45 I *L 0.0295792 +*CAP +1 33_1 0.00039984 +2 33_2 0.00014496 +3 33_3 0 +4 33_4 0.00060792 +5 33_5 2.04e-05 +6 33_6 0.00011424 +7 33_7 0 +8 33_8 0.00025896 +9 33_9 6.12e-05 +10 33_10 0.0002244 +11 33_11 5.76e-05 +12 33_12 0.00028968 +13 33_13 9.84e-05 +14 33_14 2.016e-05 +15 33_15 2.016e-05 +16 33_16 0.0003216 +17 33_17 8.16e-05 +18 33_18 4.704e-05 +19 33_19 8.16e-05 +20 33_20 0.00021888 +*RES +1 *34 33_1 4.57333 +2 33_1 *35 0 +3 33_1 33_2 2.8 +4 33_2 33_3 0 +5 33_3 *36 0 +6 33_2 33_4 7.28667 +7 33_4 33_5 0.233333 +8 33_5 *37 0 +9 33_5 33_6 3.17333 +10 33_6 33_7 0 +11 33_7 *38 0 +12 33_6 33_8 6.86 +13 33_8 33_9 0.7 +14 33_9 *39 0 +15 33_8 33_10 2.56667 +16 33_10 33_11 0.373333 +17 33_11 *40 0 +18 33_10 33_12 3.31333 +19 33_12 33_13 0.84 +20 33_13 *41 0 +21 33_12 33_14 0.56 +22 33_14 33_15 0.56 +23 33_15 *42 0 +24 33_14 33_16 2.93333 +25 33_16 33_17 0.933333 +26 33_17 *43 0 +27 33_16 33_18 1.30667 +28 33_18 33_19 0.933333 +29 33_19 *44 0 +30 33_18 33_20 3.48 +31 33_20 *45 0 +*END +*D_NET *46 0.00142584 +*CONN +*I *47 O *D CLKBUF1 +*I *48 I *L 0.0134469 +*I *49 I *L 0.0134469 +*I *50 I *L 0.0134469 +*I *51 I *L 0.0134469 +*I *52 I *L 0.0134469 +*I *53 I *L 0.0134469 +*I *54 I *L 0.0134469 +*CAP +1 46_1 0.00019632 +2 46_2 4.08e-05 +3 46_3 0.00017472 +4 46_4 0.00012144 +5 46_5 0.000306 +6 46_6 2.04e-05 +7 46_7 0.00011136 +8 46_8 1.344e-05 +9 46_9 0.0001536 +10 46_10 2.016e-05 +11 46_11 6.6e-05 +12 46_12 3.36e-05 +13 46_13 0.000168 +*RES +1 *47 46_1 3.45333 +2 46_1 46_2 0.466667 +3 46_2 *48 0 +4 46_1 46_3 4.85333 +5 46_3 46_4 2.70667 +6 46_4 *49 0 +7 46_3 46_5 3.5 +8 46_5 46_6 0.233333 +9 46_6 *50 0 +10 46_6 46_7 1.89333 +11 46_7 46_8 0.373333 +12 46_8 *51 0 +13 46_7 46_9 1.06667 +14 46_9 46_10 0.56 +15 46_10 *52 0 +16 46_9 46_11 0.633333 +17 46_11 46_12 0.933333 +18 46_12 *53 0 +19 46_11 46_13 4.66667 +20 46_13 *54 0 +*END +*D_NET *55 0.00168984 +*CONN +*I *56 O *D CLKBUF1 +*I *57 I *L 0.0134469 +*I *58 I *L 0.0134469 +*I *59 I *L 0.0134469 +*I *60 I *L 0.0134469 +*I *61 I *L 0.0134469 +*I *62 I *L 0.0134469 +*I *63 I *L 0.0134469 +*CAP +1 55_1 6.96e-05 +2 55_2 4.224e-05 +3 55_3 9.408e-05 +4 55_4 0.0003672 +5 55_5 0.0001008 +6 55_6 3.84e-05 +7 55_7 0 +8 55_8 0.0003264 +9 55_9 2.04e-05 +10 55_10 0.00014784 +11 55_11 0.00015648 +12 55_12 0 +13 55_13 0.0003264 +*RES +1 *56 55_1 0.933333 +2 55_1 55_2 0.573333 +3 55_2 *57 0 +4 55_1 55_3 2.61333 +5 55_3 55_4 4.2 +6 55_4 *58 0 +7 55_3 55_5 2.8 +8 55_5 55_6 0.266667 +9 55_6 55_7 0 +10 55_7 *59 0 +11 55_7 55_8 3.73333 +12 55_8 55_9 0.233333 +13 55_9 *60 0 +14 55_9 55_10 4.10667 +15 55_10 *61 0 +16 55_5 55_11 3.74667 +17 55_11 55_12 0 +18 55_12 *62 0 +19 55_12 55_13 3.73333 +20 55_13 *63 0 +*END +*D_NET *64 0.0014496 +*CONN +*I *65 O *D BUFX4 +*I *66 I *L 0.0357813 +*I *67 I *L 0.0357813 +*I *68 I *L 0.0357813 +*I *69 I *L 0.0357813 +*I *70 I *L 0.0357813 +*I *71 I *L 0.0357813 +*I *72 I *L 0.0357813 +*CAP +1 64_1 2.04e-05 +2 64_2 0.0001632 +3 64_3 0.0002244 +4 64_4 0.0002088 +5 64_5 4.032e-05 +6 64_6 2.016e-05 +7 64_7 0 +8 64_8 0.0002448 +9 64_9 0.00014064 +10 64_10 0.0002448 +11 64_11 0.00014208 +*RES +1 *65 64_1 0.233333 +2 64_1 64_2 1.86667 +3 64_2 64_3 2.56667 +4 64_3 *66 0 +5 64_2 64_4 5.13333 +6 64_4 *67 0 +7 64_4 64_5 1.12 +8 64_5 64_6 0.56 +9 64_6 64_7 0 +10 64_7 *68 0 +11 64_7 64_8 2.8 +12 64_8 *69 0 +13 64_5 64_9 1.44 +14 64_9 *70 0 +15 64_9 64_10 2.8 +16 64_10 *71 0 +17 64_1 64_11 2.61333 +18 64_11 *72 0 +*END +*D_NET *73 0.00136704 +*CONN +*I *74 O *D BUFX4 +*I *75 I *L 0.0357813 +*I *76 I *L 0.0357813 +*I *77 I *L 0.0357813 +*I *78 I *L 0.0357813 +*I *79 I *L 0.0357813 +*I *80 I *L 0.0357813 +*I *81 I *L 0.0357813 +*CAP +1 73_1 0.00012528 +2 73_2 0.000204 +3 73_3 2.04e-05 +4 73_4 0.0002988 +5 73_5 2.04e-05 +6 73_6 4.704e-05 +7 73_7 0.0002448 +8 73_8 2.04e-05 +9 73_9 0.0002916 +10 73_10 2.04e-05 +11 73_11 7.392e-05 +*RES +1 *74 73_1 1.58667 +2 73_1 *75 0 +3 73_1 73_2 2.33333 +4 73_2 73_3 0.233333 +5 73_3 *76 0 +6 73_3 73_4 3.96667 +7 73_4 73_5 0.233333 +8 73_5 *77 0 +9 73_5 73_6 1.30667 +10 73_6 *78 0 +11 73_1 73_7 2.8 +12 73_7 73_8 0.233333 +13 73_8 *79 0 +14 73_8 73_9 4.43333 +15 73_9 73_10 0.233333 +16 73_10 *80 0 +17 73_10 73_11 2.05333 +18 73_11 *81 0 +*END +*D_NET *82 0.00207312 +*CONN +*I *83 O *D DFFSR +*I *84 I *L 0.0222511 +*I *85 I *L 0.0222511 +*I *86 I *L 0.0265618 +*I *87 I *L 0.0180101 +*I *88 I *L 0.109759 +*I *89 I *L 0.0180101 +*I *90 I *L 0.0265312 +*CAP +1 82_1 2.04e-05 +2 82_2 0.00031056 +3 82_3 9.408e-05 +4 82_4 8.112e-05 +5 82_5 0.00025008 +6 82_6 2.04e-05 +7 82_7 8.784e-05 +8 82_8 0.0001716 +9 82_9 0.00021936 +10 82_10 7.68e-05 +11 82_11 0.0004356 +12 82_12 2.04e-05 +13 82_13 0.00028488 +*RES +1 *83 82_1 0.233333 +2 82_1 82_2 6.62667 +3 82_2 82_3 2.61333 +4 82_3 82_4 1.58667 +5 82_4 *84 0 +6 82_3 82_5 2.48 +7 82_5 82_6 0.233333 +8 82_6 *85 0 +9 82_6 82_7 1.77333 +10 82_7 *86 0 +11 82_2 82_8 2.1 +12 82_8 *87 0 +13 82_1 82_9 3.89333 +14 82_9 82_10 0.533333 +15 82_10 *88 0 +16 82_9 82_11 8.56667 +17 82_11 82_12 0.233333 +18 82_12 *89 0 +19 82_12 82_13 4.24667 +20 82_13 *90 0 +*END +*D_NET *91 0.0011868 +*CONN +*I *92 O *D CLKBUF1 +*I *93 I *L 0.0134469 +*I *94 I *L 0.0134469 +*I *95 I *L 0.0134469 +*I *96 I *L 0.0134469 +*I *97 I *L 0.0134469 +*I *98 I *L 0.0134469 +*CAP +1 91_1 0.00020952 +2 91_2 0 +3 91_3 0.0002124 +4 91_4 0.00016968 +5 91_5 0.00016896 +6 91_6 1.344e-05 +7 91_7 0.0001536 +8 91_8 1.344e-05 +9 91_9 0 +10 91_10 0.000168 +11 91_11 7.776e-05 +*RES +1 *92 91_1 4.15333 +2 91_1 91_2 0 +3 91_2 *93 0 +4 91_2 91_3 2.56667 +5 91_3 91_4 2.38 +6 91_4 *94 0 +7 91_3 91_5 2.29333 +8 91_5 91_6 0.373333 +9 91_6 *95 0 +10 91_5 91_7 1.06667 +11 91_7 91_8 0.373333 +12 91_8 91_9 0 +13 91_9 *96 0 +14 91_8 91_10 4.66667 +15 91_10 *97 0 +16 91_7 91_11 0.96 +17 91_11 *98 0 +*END +*D_NET *99 0.00132288 +*CONN +*I *100 O *D CLKBUF1 +*I *101 I *L 0.0134469 +*I *102 I *L 0.0134469 +*I *103 I *L 0.0134469 +*I *104 I *L 0.0134469 +*I *105 I *L 0.0134469 +*I *106 I *L 0.0134469 +*CAP +1 99_1 8.4e-06 +2 99_2 0.00025128 +3 99_3 0.0001008 +4 99_4 4.08e-05 +5 99_5 0.00035304 +6 99_6 2.04e-05 +7 99_7 0.00012144 +8 99_8 0.00017136 +9 99_9 3.36e-05 +10 99_10 0.00022176 +*RES +1 *100 99_1 0.233333 +2 99_1 99_2 3.31333 +3 99_2 *101 0 +4 99_1 99_3 2.8 +5 99_3 99_4 0.466667 +6 99_4 *102 0 +7 99_3 99_5 4.80667 +8 99_5 99_6 0.233333 +9 99_6 *103 0 +10 99_6 99_7 1.30667 +11 99_7 *104 0 +12 99_1 99_8 4.76 +13 99_8 99_9 0.933333 +14 99_9 *105 0 +15 99_8 99_10 1.96 +16 99_10 *106 0 +*END +*D_NET *107 0.0013524 +*CONN +*I *108 O *D CLKBUF1 +*I *109 I *L 0.0134469 +*I *110 I *L 0.0134469 +*I *111 I *L 0.0134469 +*I *112 I *L 0.0134469 +*I *113 I *L 0.0134469 +*I *114 I *L 0.0134469 +*CAP +1 107_1 0.00023664 +2 107_2 4.08e-05 +3 107_3 0.0001764 +4 107_4 3.36e-05 +5 107_5 0.00035304 +6 107_6 4.08e-05 +7 107_7 0.00012768 +8 107_8 2.688e-05 +9 107_9 8.4e-06 +10 107_10 0.0001536 +11 107_11 0.00015456 +*RES +1 *108 107_1 2.70667 +2 107_1 107_2 0.466667 +3 107_2 *109 0 +4 107_1 107_3 3.5 +5 107_3 107_4 0.933333 +6 107_4 *110 0 +7 107_3 107_5 4.80667 +8 107_5 107_6 0.466667 +9 107_6 *111 0 +10 107_5 107_7 2.14667 +11 107_7 107_8 0.746667 +12 107_8 *112 0 +13 107_7 107_9 0.233333 +14 107_9 107_10 1.06667 +15 107_10 *113 0 +16 107_9 107_11 4.29333 +17 107_11 *114 0 +*END +*D_NET *115 0.0011508 +*CONN +*I *116 O *D BUFX4 +*I *117 I *L 0.0357813 +*I *118 I *L 0.0357813 +*I *119 I *L 0.0357813 +*I *120 I *L 0.0357813 +*I *121 I *L 0.0357813 +*I *122 I *L 0.0357813 +*CAP +1 115_1 2.04e-05 +2 115_2 0.0001428 +3 115_3 0.00010848 +4 115_4 1.344e-05 +5 115_5 0.0002448 +6 115_6 2.04e-05 +7 115_7 0.00010944 +8 115_8 1.344e-05 +9 115_9 0.0002448 +10 115_10 0.0002328 +*RES +1 *116 115_1 0.233333 +2 115_1 115_2 1.63333 +3 115_2 *117 0 +4 115_1 115_3 1.68 +5 115_3 115_4 0.373333 +6 115_4 *118 0 +7 115_3 115_5 2.8 +8 115_5 115_6 0.233333 +9 115_6 *119 0 +10 115_6 115_7 1.04 +11 115_7 115_8 0.373333 +12 115_8 *120 0 +13 115_8 115_9 2.8 +14 115_9 *121 0 +15 115_7 115_10 1.8 +16 115_10 *122 0 +*END +*D_NET *123 0.00152688 +*CONN +*I *124 O *D BUFX4 +*I *125 I *L 0.0357813 +*I *126 I *L 0.0357813 +*I *127 I *L 0.0357813 +*I *128 I *L 0.0357813 +*I *129 I *L 0.0357813 +*I *130 I *L 0.0357813 +*CAP +1 123_1 0.00015552 +2 123_2 0.0001632 +3 123_3 0.0002448 +4 123_4 0.000102 +5 123_5 0.0003324 +6 123_6 0.00026376 +7 123_7 2.04e-05 +8 123_8 0.0002448 +*RES +1 *124 123_1 2.98667 +2 123_1 123_2 1.86667 +3 123_2 *125 0 +4 123_2 123_3 2.8 +5 123_3 *126 0 +6 123_1 123_4 1.16667 +7 123_4 *127 0 +8 123_4 123_5 4.9 +9 123_5 *128 0 +10 123_1 123_6 4.99333 +11 123_6 123_7 0.233333 +12 123_7 *129 0 +13 123_7 123_8 2.8 +14 123_8 *130 0 +*END +*D_NET *131 0.00107832 +*CONN +*I *132 O *D BUFX4 +*I *133 I *L 0.0323255 +*I *134 I *L 0.0357813 +*I *135 I *L 0.0357813 +*I *136 I *L 0.0357813 +*I *137 I *L 0.0357813 +*I *138 I *L 0.0357813 +*CAP +1 131_1 2.688e-05 +2 131_2 1.344e-05 +3 131_3 0.0002244 +4 131_4 8.736e-05 +5 131_5 0.00027744 +6 131_6 0.000204 +7 131_7 0.0002448 +*RES +1 *132 131_1 0.746667 +2 131_1 131_2 0.373333 +3 131_2 *133 0 +4 131_1 131_3 2.56667 +5 131_3 *134 0 +6 131_3 131_4 2.42667 +7 131_4 *135 0 +8 131_4 131_5 3.17333 +9 131_5 *136 0 +10 131_5 131_6 2.33333 +11 131_6 *137 0 +12 131_6 131_7 2.8 +13 131_7 *138 0 +*END +*D_NET *139 0.00160872 +*CONN +*P *139 O +*I *140 I *L 0.0549205 +*I *141 I *L 0.0549205 +*I *142 I *L 0.0549205 +*I *143 I *L 0.0549205 +*I *144 I *L 0.0549205 +*CAP +1 139_1 0.00018768 +2 139_2 2.04e-05 +3 139_3 0.00039456 +4 139_4 0.00024408 +5 139_5 0.00011496 +6 139_6 8.16e-05 +7 139_7 0.00020184 +8 139_8 0.000282 +9 139_9 8.16e-05 +*RES +1 *139 139_1 2.14667 +2 139_1 139_2 0.233333 +3 139_2 *140 0 +4 139_2 139_3 3.89333 +5 139_3 139_4 3.78 +6 139_4 *141 0 +7 139_3 139_5 2.19333 +8 139_5 139_6 0.933333 +9 139_6 *142 0 +10 139_5 139_7 5.27333 +11 139_7 139_8 2.94 +12 139_8 *143 0 +13 139_7 139_9 0.933333 +14 139_9 *144 0 +*END +*D_NET *145 0.00196128 +*CONN +*I *146 O *D INVX8 +*I *147 I *L 0.0204034 +*I *148 I *L 0.0204034 +*I *149 I *L 0.0204034 +*I *150 I *L 0.0204034 +*I *151 I *L 0.0204034 +*CAP +1 145_1 0.00029112 +2 145_2 5.76e-05 +3 145_3 0.00010848 +4 145_4 0.00033096 +5 145_5 0.0002676 +6 145_6 0.00014112 +7 145_7 0.0004812 +8 145_8 4.08e-05 +9 145_9 0.0002424 +*RES +1 *146 145_1 5.08667 +2 145_1 145_2 0.373333 +3 145_2 *147 0 +4 145_1 145_3 1.68 +5 145_3 145_4 6.86 +6 145_4 *148 0 +7 145_3 145_5 2.03333 +8 145_5 145_6 3.92 +9 145_6 *149 0 +10 145_5 145_7 5.83333 +11 145_7 145_8 0.466667 +12 145_8 *150 0 +13 145_7 145_9 6.06667 +14 145_9 *151 0 +*END +*D_NET *152 0.00052392 +*CONN +*I *153 O *D BUFX4 +*I *154 I *L 0.0265613 +*I *155 I *L 0.0265613 +*I *156 I *L 0.0270702 +*I *157 I *L 0.0270702 +*I *158 I *L 0.0265613 +*CAP +1 152_1 0.0002244 +2 152_2 0.0001584 +3 152_3 1.344e-05 +4 152_4 4.032e-05 +5 152_5 0 +6 152_6 4.032e-05 +7 152_7 0 +8 152_8 4.704e-05 +*RES +1 *153 152_1 2.43333 +2 152_1 152_2 1.02667 +3 152_2 *154 0 +4 152_1 152_3 0.373333 +5 152_3 *155 0 +6 152_1 152_4 1.12 +7 152_4 152_5 0 +8 152_5 *156 0 +9 152_4 152_6 1.12 +10 152_6 152_7 0 +11 152_7 *157 0 +12 152_6 152_8 1.30667 +13 152_8 *158 0 +*END +*D_NET *159 0.00088848 +*CONN +*I *160 O *D BUFX4 +*I *161 I *L 0.0270702 +*I *162 I *L 0.0265613 +*I *163 I *L 0.0270702 +*I *164 I *L 0.0270702 +*I *165 I *L 0.0265613 +*CAP +1 159_1 0.000216 +2 159_2 4.704e-05 +3 159_3 0 +4 159_4 0.0003312 +5 159_5 0.00020784 +6 159_6 8.64e-05 +*RES +1 *160 159_1 1.4 +2 159_1 *161 0 +3 159_1 159_2 1.30667 +4 159_2 159_3 0 +5 159_3 *162 0 +6 159_3 159_4 3.36 +7 159_4 *163 0 +8 159_2 159_5 3.30667 +9 159_5 *164 0 +10 159_5 159_6 0.56 +11 159_6 *165 0 +*END +*D_NET *166 0.00124008 +*CONN +*I *167 O *D BUFX4 +*I *168 I *L 0.0226301 +*I *169 I *L 0.022204 +*I *170 I *L 0.0265312 +*I *171 I *L 0.0180033 +*I *172 I *L 0.0227534 +*CAP +1 166_1 0.0001692 +2 166_2 4.08e-05 +3 166_3 0.00011424 +4 166_4 8.16e-05 +5 166_5 0.0001488 +6 166_6 0.00010752 +7 166_7 0.00052032 +8 166_8 5.76e-05 +*RES +1 *167 166_1 3.03333 +2 166_1 166_2 0.466667 +3 166_2 *168 0 +4 166_1 166_3 3.17333 +5 166_3 166_4 0.933333 +6 166_4 *169 0 +7 166_3 166_5 1.73333 +8 166_5 166_6 2.98667 +9 166_6 *170 0 +10 166_5 166_7 5.52 +11 166_7 *171 0 +12 166_7 166_8 0.373333 +13 166_8 *172 0 +*END +*D_NET *173 0.00109848 +*CONN +*I *174 O *D DFFSR +*I *175 I *L 0.0134147 +*I *176 I *L 0.0134094 +*I *177 I *L 0.0310602 +*I *178 I *L 0.0310602 +*I *179 I *L 0.0180101 +*CAP +1 173_1 0.0004548 +2 173_2 0.00015624 +3 173_3 9.48e-05 +4 173_4 1.344e-05 +5 173_5 0 +6 173_6 4.704e-05 +7 173_7 0.0001536 +8 173_8 0.00017856 +*RES +1 *174 173_1 6.3 +2 173_1 *175 0 +3 173_1 173_2 2.00667 +4 173_2 173_3 0.833333 +5 173_3 173_4 0.373333 +6 173_4 173_5 0 +7 173_5 *176 0 +8 173_4 173_6 1.30667 +9 173_6 *177 0 +10 173_3 173_7 2.42667 +11 173_7 *178 0 +12 173_2 173_8 4.29333 +13 173_8 *179 0 +*END +*D_NET *180 0.00102312 +*CONN +*I *181 O *D DFFSR +*I *182 I *L 0.0311174 +*I *183 I *L 0.0311174 +*I *184 I *L 0.0274396 +*I *185 I *L 0.0134147 +*I *186 I *L 0.0265312 +*CAP +1 180_1 0.00021 +2 180_2 6.12e-05 +3 180_3 0.00014784 +4 180_4 6.12e-05 +5 180_5 2.04e-05 +6 180_6 0.00023064 +7 180_7 8.784e-05 +8 180_8 2.04e-05 +9 180_9 0.0001836 +*RES +1 *181 180_1 3.5 +2 180_1 180_2 0.7 +3 180_2 *182 0 +4 180_1 180_3 4.10667 +5 180_3 180_4 0.7 +6 180_4 180_5 0.233333 +7 180_5 *183 0 +8 180_5 180_6 3.40667 +9 180_6 *184 0 +10 180_3 180_7 1.77333 +11 180_7 180_8 0.233333 +12 180_8 *185 0 +13 180_8 180_9 2.1 +14 180_9 *186 0 +*END +*D_NET *187 0.00120216 +*CONN +*I *188 O *D NAND3X1 +*I *189 I *L 0.0435905 +*I *190 I *L 0.0270661 +*I *191 I *L 0.0317844 +*I *192 I *L 0.0270702 +*I *193 I *L 0.0134094 +*CAP +1 187_1 7.776e-05 +2 187_2 0.00020376 +3 187_3 0.00042744 +4 187_4 2.04e-05 +5 187_5 0.00017952 +6 187_6 5.424e-05 +7 187_7 0.00023904 +*RES +1 *188 187_1 0.933333 +2 187_1 *189 0 +3 187_1 187_2 2.66 +4 187_2 *190 0 +5 187_1 187_3 6.20667 +6 187_3 187_4 0.233333 +7 187_4 *191 0 +8 187_4 187_5 2.45333 +9 187_5 187_6 0.84 +10 187_6 *192 0 +11 187_5 187_7 2.64 +12 187_7 *193 0 +*END +*D_NET *194 0.00066672 +*CONN +*I *195 O *D INVX8 +*I *196 I *L 0.0204034 +*I *197 I *L 0.0204034 +*I *198 I *L 0.0204034 +*I *199 I *L 0.0204034 +*CAP +1 194_1 0.00022392 +2 194_2 0 +3 194_3 8.736e-05 +4 194_4 3.264e-05 +5 194_5 0.0002652 +6 194_6 5.76e-05 +*RES +1 *195 194_1 3.22 +2 194_1 194_2 0 +3 194_2 *196 0 +4 194_2 194_3 2.42667 +5 194_3 194_4 0.373333 +6 194_4 *197 0 +7 194_3 194_5 3.03333 +8 194_5 *198 0 +9 194_2 194_6 0.373333 +10 194_6 *199 0 +*END +*D_NET *200 0.00067896 +*CONN +*I *201 O *D BUFX4 +*I *202 I *L 0.0270702 +*I *203 I *L 0.0265613 +*I *204 I *L 0.0270702 +*I *205 I *L 0.0265613 +*CAP +1 200_1 0.00019992 +2 200_2 5.76e-05 +3 200_3 8.4e-06 +4 200_4 5.376e-05 +5 200_5 0.00029184 +6 200_6 2.04e-05 +7 200_7 4.704e-05 +*RES +1 *201 200_1 3.22 +2 200_1 200_2 0.373333 +3 200_2 *202 0 +4 200_1 200_3 0.233333 +5 200_3 200_4 1.49333 +6 200_4 *203 0 +7 200_3 200_5 4.10667 +8 200_5 200_6 0.233333 +9 200_6 *204 0 +10 200_6 200_7 1.30667 +11 200_7 *205 0 +*END +*D_NET *206 0.0007644 +*CONN +*I *207 O *D DFFSR +*I *208 I *L 0.0524659 +*I *209 I *L 0.0134094 +*I *210 I *L 0.0134147 +*I *211 I *L 0.0227534 +*CAP +1 206_1 5.376e-05 +2 206_2 0.00015504 +3 206_3 4.08e-05 +4 206_4 2.04e-05 +5 206_5 0.00019008 +6 206_6 0.00014112 +7 206_7 0.0001632 +*RES +1 *207 206_1 1.49333 +2 206_1 206_2 1.77333 +3 206_2 206_3 0.466667 +4 206_3 206_4 0.233333 +5 206_4 *208 0 +6 206_4 206_5 2.61333 +7 206_5 *209 0 +8 206_2 206_6 3.92 +9 206_6 *210 0 +10 206_1 206_7 1.86667 +11 206_7 *211 0 +*END +*D_NET *212 0.00036504 +*CONN +*I *213 O *D DFFSR +*I *214 I *L 0.0134147 +*I *215 I *L 0.0177358 +*I *216 I *L 0.0222369 +*I *217 I *L 0.0227534 +*CAP +1 212_1 4.704e-05 +2 212_2 4.08e-05 +3 212_3 6.72e-05 +4 212_4 4.08e-05 +5 212_5 7.44e-05 +6 212_6 0 +7 212_7 9.48e-05 +*RES +1 *213 212_1 1.30667 +2 212_1 212_2 0.466667 +3 212_2 *214 0 +4 212_1 212_3 1.86667 +5 212_3 212_4 0.466667 +6 212_4 *215 0 +7 212_3 212_5 1.4 +8 212_5 212_6 0 +9 212_6 *216 0 +10 212_6 212_7 1.63333 +11 212_7 *217 0 +*END +*D_NET *218 0.00085248 +*CONN +*I *219 O *D DFFSR +*I *220 I *L 0.0134147 +*I *221 I *L 0.0270661 +*I *222 I *L 0.0134094 +*I *223 I *L 0.0317844 +*CAP +1 218_1 0.00019008 +2 218_2 0.0002472 +3 218_3 6.768e-05 +4 218_4 0.00011712 +5 218_5 4.08e-05 +6 218_6 0.0001896 +*RES +1 *219 218_1 2.61333 +2 218_1 *220 0 +3 218_1 218_2 2.6 +4 218_2 218_3 1.21333 +5 218_3 *221 0 +6 218_2 218_4 1.65333 +7 218_4 218_5 0.466667 +8 218_5 *222 0 +9 218_4 218_6 2.14667 +10 218_6 *223 0 +*END +*D_NET *224 0.00113856 +*CONN +*I *225 O *D DFFSR +*I *226 I *L 0.0134147 +*I *227 I *L 0.0134094 +*I *228 I *L 0.0180101 +*I *229 I *L 0.0265312 +*CAP +1 224_1 8.64e-05 +2 224_2 0.00076344 +3 224_3 0 +4 224_4 0.00019392 +5 224_5 0 +6 224_6 9.48e-05 +*RES +1 *225 224_1 0.56 +2 224_1 *226 0 +3 224_1 224_2 8.44667 +4 224_2 224_3 0 +5 224_3 *227 0 +6 224_3 224_4 3.58667 +7 224_4 224_5 0 +8 224_5 *228 0 +9 224_5 224_6 1.63333 +10 224_6 *229 0 +*END +*D_NET *230 0.00090456 +*CONN +*I *231 O *D DFFSR +*I *232 I *L 0.0134147 +*I *233 I *L 0.0222369 +*I *234 I *L 0.0270702 +*I *235 I *L 0.0265312 +*CAP +1 230_1 0.00010656 +2 230_2 8.4e-06 +3 230_3 0.0001188 +4 230_4 2.04e-05 +5 230_5 0.00033288 +6 230_6 0.00011424 +7 230_7 0.00020328 +*RES +1 *231 230_1 1.12 +2 230_1 230_2 0.233333 +3 230_2 230_3 1.07333 +4 230_3 *232 0 +5 230_2 230_4 0.233333 +6 230_4 *233 0 +7 230_2 230_5 8.91333 +8 230_5 230_6 1.30667 +9 230_6 *234 0 +10 230_5 230_7 3.31333 +11 230_7 *235 0 +*END +*D_NET *236 0.00106464 +*CONN +*I *237 O *D DFFSR +*I *238 I *L 0.0134094 +*I *239 I *L 0.0134147 +*I *240 I *L 0.0265312 +*I *241 I *L 0.0435905 +*CAP +1 236_1 3.36e-05 +2 236_2 0.00026544 +3 236_3 8.736e-05 +4 236_4 0.00014232 +5 236_5 0.000162 +6 236_6 1.344e-05 +7 236_7 0.00036048 +*RES +1 *237 236_1 0.933333 +2 236_1 236_2 3.17333 +3 236_2 *238 0 +4 236_1 236_3 2.42667 +5 236_3 236_4 2.28667 +6 236_4 *239 0 +7 236_3 236_5 1.3 +8 236_5 236_6 0.373333 +9 236_6 *240 0 +10 236_5 236_7 5.34667 +11 236_7 *241 0 +*END +*D_NET *242 0.00101784 +*CONN +*I *243 O *D DFFSR +*I *244 I *L 0.0134094 +*I *245 I *L 0.0265312 +*I *246 I *L 0.0524659 +*I *247 I *L 0.0134147 +*CAP +1 242_1 0.0002532 +2 242_2 0 +3 242_3 6.768e-05 +4 242_4 0.00027768 +5 242_5 0.00015576 +6 242_6 0.00026352 +*RES +1 *243 242_1 3.03333 +2 242_1 242_2 0 +3 242_2 242_3 1.21333 +4 242_3 *244 0 +5 242_2 242_4 4.71333 +6 242_4 *245 0 +7 242_1 242_5 2.66 +8 242_5 *246 0 +9 242_1 242_6 5.32 +10 242_6 *247 0 +*END +*D_NET *248 0.00086784 +*CONN +*I *249 O *D DFFSR +*I *250 I *L 0.0265312 +*I *251 I *L 0.0134094 +*I *252 I *L 0.0435905 +*I *253 I *L 0.0134147 +*CAP +1 248_1 0.0001728 +2 248_2 2.016e-05 +3 248_3 0.0001752 +4 248_4 0.0003168 +5 248_5 1.344e-05 +6 248_6 0.00016944 +*RES +1 *249 248_1 1.12 +2 248_1 *250 0 +3 248_1 248_2 0.56 +4 248_2 248_3 1.4 +5 248_3 *251 0 +6 248_2 248_4 2.2 +7 248_4 248_5 0.373333 +8 248_5 *252 0 +9 248_4 248_6 1.64 +10 248_6 *253 0 +*END +*D_NET *254 0.00075792 +*CONN +*I *255 O *D NAND2X1 +*I *256 I *L 0.0274396 +*I *257 I *L 0.0177118 +*I *258 I *L 0.0268633 +*I *259 I *L 0.0222511 +*CAP +1 254_1 0.00042816 +2 254_2 8.64e-05 +3 254_3 2.04e-05 +4 254_4 0.0001416 +5 254_5 0 +6 254_6 8.136e-05 +*RES +1 *255 254_1 5.22667 +2 254_1 254_2 0.56 +3 254_2 *256 0 +4 254_1 254_3 0.233333 +5 254_3 *257 0 +6 254_3 254_4 1.86667 +7 254_4 254_5 0 +8 254_5 *258 0 +9 254_5 254_6 1.26 +10 254_6 *259 0 +*END +*D_NET *260 0.0005124 +*CONN +*I *261 O *D INVX2 +*I *262 I *L 0.0270702 +*I *263 I *L 0.0270702 +*I *264 I *L 0.0265613 +*I *265 I *L 0.0270702 +*CAP +1 260_1 3.36e-05 +2 260_2 1.344e-05 +3 260_3 0.00023664 +4 260_4 2.04e-05 +5 260_5 0.00012192 +6 260_6 8.64e-05 +*RES +1 *261 260_1 0.933333 +2 260_1 260_2 0.373333 +3 260_2 *262 0 +4 260_1 260_3 2.70667 +5 260_3 260_4 0.233333 +6 260_4 *263 0 +7 260_4 260_5 2.05333 +8 260_5 *264 0 +9 260_5 260_6 0.56 +10 260_6 *265 0 +*END +*D_NET *266 0.00032784 +*CONN +*P *266 O +*I *267 I *L 0.0265312 +*I *268 I *L 0.0268633 +*I *269 I *L 0.0265312 +*I *270 I *L 0.0222369 +*CAP +1 266_1 4.704e-05 +2 266_2 4.704e-05 +3 266_3 8.64e-05 +4 266_4 0.00010656 +5 266_5 4.08e-05 +*RES +1 *266 266_1 1.30667 +2 266_1 266_2 1.30667 +3 266_2 *267 0 +4 266_2 266_3 0.56 +5 266_3 *268 0 +6 266_3 266_4 0.933333 +7 266_4 *269 0 +8 266_1 266_5 0.466667 +9 266_5 *270 0 +*END +*D_NET *271 0.00080376 +*CONN +*P *271 O +*I *272 I *L 0.0265312 +*I *273 I *L 0.0134094 +*I *274 I *L 0.0265312 +*I *275 I *L 0.0222369 +*CAP +1 271_1 5.376e-05 +2 271_2 0.00029856 +3 271_3 2.04e-05 +4 271_4 6.12e-05 +5 271_5 0.00015504 +6 271_6 0.00011496 +7 271_7 9.984e-05 +*RES +1 *271 271_1 1.49333 +2 271_1 271_2 4.29333 +3 271_2 271_3 0.233333 +4 271_3 *272 0 +5 271_3 271_4 0.7 +6 271_4 271_5 1.77333 +7 271_5 *273 0 +8 271_4 271_6 2.19333 +9 271_6 *274 0 +10 271_1 271_7 0.973333 +11 271_7 *275 0 +*END +*D_NET *276 0.0004644 +*CONN +*I *277 O *D DFFSR +*I *278 I *L 0.0222369 +*I *279 I *L 0.0268633 +*I *280 I *L 0.0134147 +*CAP +1 276_1 0.00026328 +2 276_2 8.64e-05 +3 276_3 1.344e-05 +4 276_4 0.00010128 +*RES +1 *277 276_1 3.11333 +2 276_1 276_2 0.56 +3 276_2 *278 0 +4 276_1 276_3 0.373333 +5 276_3 *279 0 +6 276_1 276_4 2.14667 +7 276_4 *280 0 +*END +*D_NET *281 0.00029832 +*CONN +*I *282 O *D NOR2X1 +*I *283 I *L 0.022204 +*I *284 I *L 0.0177118 +*I *285 I *L 0.0222511 +*CAP +1 281_1 9.84e-05 +2 281_2 0 +3 281_3 6.072e-05 +4 281_4 4.08e-05 +5 281_5 9.84e-05 +*RES +1 *282 281_1 0.866667 +2 281_1 281_2 0 +3 281_2 *283 0 +4 281_1 281_3 1.35333 +5 281_3 281_4 0.466667 +6 281_4 *284 0 +7 281_3 281_5 0.84 +8 281_5 *285 0 +*END +*D_NET *286 0.00032112 +*CONN +*I *287 O *D DFFSR +*I *288 I *L 0.0134147 +*I *289 I *L 0.0222369 +*I *290 I *L 0.0134094 +*CAP +1 286_1 0.00017544 +2 286_2 0 +3 286_3 8.808e-05 +4 286_4 5.76e-05 +*RES +1 *287 286_1 2.00667 +2 286_1 286_2 0 +3 286_2 *288 0 +4 286_2 286_3 1.44667 +5 286_3 *289 0 +6 286_3 286_4 0.373333 +7 286_4 *290 0 +*END +*D_NET *291 0.00054816 +*CONN +*I *292 O *D NOR2X1 +*I *293 I *L 0.022204 +*I *294 I *L 0.0180112 +*I *295 I *L 0.0226301 +*CAP +1 291_1 0.0004368 +2 291_2 0 +3 291_3 5.04e-05 +4 291_4 0 +5 291_5 6.096e-05 +*RES +1 *292 291_1 6.53333 +2 291_1 291_2 0 +3 291_2 *293 0 +4 291_1 291_3 1.4 +5 291_3 291_4 0 +6 291_4 *294 0 +7 291_3 291_5 1.02667 +8 291_5 *295 0 +*END +*D_NET *296 0.00062568 +*CONN +*I *297 O *D DFFSR +*I *298 I *L 0.0222511 +*I *299 I *L 0.0134094 +*I *300 I *L 0.0135592 +*CAP +1 296_1 0.00016968 +2 296_2 7.8e-05 +3 296_3 8.064e-05 +4 296_4 8.16e-05 +5 296_5 0.00021576 +*RES +1 *297 296_1 2.38 +2 296_1 296_2 0.606667 +3 296_2 *298 0 +4 296_1 296_3 2.24 +5 296_3 296_4 0.933333 +6 296_4 *299 0 +7 296_3 296_5 4.99333 +8 296_5 *300 0 +*END +*D_NET *301 0.00110448 +*CONN +*I *302 O *D DFFSR +*I *303 I *L 0.0134094 +*I *304 I *L 0.0265312 +*I *305 I *L 0.0134147 +*CAP +1 301_1 9.456e-05 +2 301_2 0.0001548 +3 301_3 0.00051192 +4 301_4 0.0001188 +5 301_5 0.0002244 +*RES +1 *302 301_1 1.96 +2 301_1 301_2 2.1 +3 301_2 *303 0 +4 301_1 301_3 4.48667 +5 301_3 301_4 1.07333 +6 301_4 *304 0 +7 301_3 301_5 2.56667 +8 301_5 *305 0 +*END +*D_NET *306 0.00052968 +*CONN +*I *307 O *D DFFSR +*I *308 I *L 0.0134094 +*I *309 I *L 0.0134147 +*I *310 I *L 0.0265312 +*CAP +1 306_1 0 +2 306_2 0.00011472 +3 306_3 0.00028536 +4 306_4 0.0001296 +*RES +1 *307 306_1 0 +2 306_1 306_2 2.52 +3 306_2 *308 0 +4 306_1 306_3 3.59333 +5 306_3 *309 0 +6 306_3 306_4 0.84 +7 306_4 *310 0 +*END +*D_NET *311 0.000822 +*CONN +*I *312 O *D DFFSR +*I *313 I *L 0.0265312 +*I *314 I *L 0.0134094 +*I *315 I *L 0.0134147 +*CAP +1 311_1 0 +2 311_2 0.00029136 +3 311_3 5.76e-05 +4 311_4 0.000108 +5 311_5 0.00036504 +*RES +1 *312 311_1 0 +2 311_1 311_2 4.76 +3 311_2 311_3 0.373333 +4 311_3 *313 0 +5 311_2 311_4 0.7 +6 311_4 *314 0 +7 311_1 311_5 7.14 +8 311_5 *315 0 +*END +*D_NET *316 0.00047376 +*CONN +*I *317 O *D DFFSR +*I *318 I *L 0.0524659 +*I *319 I *L 0.0134094 +*I *320 I *L 0.0134147 +*CAP +1 316_1 0.0001224 +2 316_2 0 +3 316_3 0.00017088 +4 316_4 2.304e-05 +5 316_5 0.00015744 +*RES +1 *317 316_1 1.4 +2 316_1 316_2 0 +3 316_2 *318 0 +4 316_2 316_3 1.74667 +5 316_3 316_4 0.44 +6 316_4 *319 0 +7 316_3 316_5 2.77333 +8 316_5 *320 0 +*END +*D_NET *321 0.00048144 +*CONN +*P *321 O +*I *322 I *L 0.0177118 +*I *323 I *L 0.0222369 +*I *324 I *L 0.0134094 +*CAP +1 321_1 0.0001836 +2 321_2 0 +3 321_3 5.376e-05 +4 321_4 4.08e-05 +5 321_5 0.00020328 +*RES +1 *321 321_1 2.1 +2 321_1 321_2 0 +3 321_2 *322 0 +4 321_2 321_3 1.49333 +5 321_3 321_4 0.466667 +6 321_4 *323 0 +7 321_3 321_5 3.31333 +8 321_5 *324 0 +*END +*D_NET *325 0.0005136 +*CONN +*I *326 O *D NOR2X1 +*I *327 I *L 0.0265312 +*I *328 I *L 0.0227534 +*I *329 I *L 0.0180033 +*CAP +1 325_1 0 +2 325_2 8.784e-05 +3 325_3 0.00020976 +4 325_4 0.000216 +*RES +1 *326 325_1 0 +2 325_1 325_2 1.77333 +3 325_2 *327 0 +4 325_1 325_3 3.82667 +5 325_3 *328 0 +6 325_3 325_4 1.4 +7 325_4 *329 0 +*END +*D_NET *330 0.00036576 +*CONN +*I *331 O *D AND2X2 +*I *332 I *L 0.0270702 +*I *333 I *L 0.0180112 +*I *334 I *L 0.0435905 +*CAP +1 330_1 8.64e-05 +2 330_2 7.392e-05 +3 330_3 4.08e-05 +4 330_4 0.00016464 +*RES +1 *331 330_1 0.56 +2 330_1 *332 0 +3 330_1 330_2 2.05333 +4 330_2 330_3 0.466667 +5 330_3 *333 0 +6 330_2 330_4 2.30667 +7 330_4 *334 0 +*END +*D_NET *335 0.00046512 +*CONN +*I *336 O *D NOR2X1 +*I *337 I *L 0.0180112 +*I *338 I *L 0.022204 +*I *339 I *L 0.0265613 +*CAP +1 335_1 0.0001428 +2 335_2 2.04e-05 +3 335_3 0.00026136 +4 335_4 2.04e-05 +5 335_5 2.016e-05 +*RES +1 *336 335_1 1.63333 +2 335_1 335_2 0.233333 +3 335_2 *337 0 +4 335_2 335_3 3.59333 +5 335_3 335_4 0.233333 +6 335_4 *338 0 +7 335_4 335_5 0.56 +8 335_5 *339 0 +*END +*D_NET *340 0.00022992 +*CONN +*I *341 O *D NAND2X1 +*I *342 I *L 0.0270702 +*I *343 I *L 0.0270702 +*I *344 I *L 0.0177118 +*CAP +1 340_1 4.704e-05 +2 340_2 0.0001152 +3 340_3 4.08e-05 +4 340_4 2.688e-05 +*RES +1 *341 340_1 1.30667 +2 340_1 340_2 0.746667 +3 340_2 *342 0 +4 340_1 340_3 0.466667 +5 340_3 *343 0 +6 340_1 340_4 0.746667 +7 340_4 *344 0 +*END +*D_NET *345 0.00047544 +*CONN +*I *346 O *D INVX2 +*I *347 I *L 0.022204 +*I *348 I *L 0.022204 +*I *349 I *L 0.0524659 +*CAP +1 345_1 0.0001428 +2 345_2 2.04e-05 +3 345_3 2.688e-05 +4 345_4 2.016e-05 +5 345_5 0.0002652 +*RES +1 *346 345_1 1.63333 +2 345_1 345_2 0.233333 +3 345_2 *347 0 +4 345_2 345_3 0.746667 +5 345_3 345_4 0.56 +6 345_4 *348 0 +7 345_3 345_5 3.03333 +8 345_5 *349 0 +*END +*D_NET *350 0.00134712 +*CONN +*I *351 O *D NAND3X1 +*I *352 I *L 0.0270702 +*I *353 I *L 0.0270702 +*I *354 I *L 0.0134094 +*CAP +1 350_1 0.00042144 +2 350_2 0.00065112 +3 350_3 2.688e-05 +4 350_4 0.00024768 +*RES +1 *351 350_1 4.30667 +2 350_1 350_2 7.88667 +3 350_2 *352 0 +4 350_1 350_3 0.746667 +5 350_3 *353 0 +6 350_1 350_4 2.28 +7 350_4 *354 0 +*END +*D_NET *355 0.00038256 +*CONN +*I *356 O *D INVX1 +*I *357 I *L 0.0226301 +*I *358 I *L 0.0270702 +*I *359 I *L 0.0265312 +*CAP +1 355_1 0.0001308 +2 355_2 5.376e-05 +3 355_3 0.0001236 +4 355_4 1.344e-05 +5 355_5 6.096e-05 +*RES +1 *356 355_1 1.63333 +2 355_1 355_2 1.49333 +3 355_2 *357 0 +4 355_1 355_3 1.03333 +5 355_3 355_4 0.373333 +6 355_4 *358 0 +7 355_3 355_5 1.02667 +8 355_5 *359 0 +*END +*D_NET *360 0.00116424 +*CONN +*P *360 O +*I *361 I *L 0.0265312 +*I *362 I *L 0.0134094 +*I *363 I *L 0.0265312 +*CAP +1 360_1 2.688e-05 +2 360_2 8.4e-06 +3 360_3 2.04e-05 +4 360_4 0.00048936 +5 360_5 0.0006192 +*RES +1 *360 360_1 0.746667 +2 360_1 360_2 0.233333 +3 360_2 360_3 0.233333 +4 360_3 *361 0 +5 360_3 360_4 5.92667 +6 360_4 *362 0 +7 360_2 360_5 5 +8 360_5 *363 0 +*END +*D_NET *364 0.0003936 +*CONN +*I *365 O *D NAND3X1 +*I *366 I *L 0.0270702 +*I *367 I *L 0.0270702 +*CAP +1 364_1 0.0002784 +2 364_2 0.0001152 +*RES +1 *365 364_1 2.61333 +2 364_1 *366 0 +3 364_1 364_2 0.746667 +4 364_2 *367 0 +*END +*D_NET *368 0.00014352 +*CONN +*I *369 O *D DFFSR +*I *370 I *L 0.0177358 +*I *371 I *L 0.0134094 +*CAP +1 368_1 5.376e-05 +2 368_2 2.016e-05 +3 368_3 6.96e-05 +*RES +1 *369 368_1 1.49333 +2 368_1 368_2 0.56 +3 368_2 *370 0 +4 368_1 368_3 0.933333 +5 368_3 *371 0 +*END +*D_NET *372 0.00052968 +*CONN +*I *373 O *D DFFSR +*I *374 I *L 0.0222511 +*I *375 I *L 0.0134094 +*CAP +1 372_1 0.0001728 +2 372_2 0.00035688 +*RES +1 *373 372_1 1.12 +2 372_1 *374 0 +3 372_1 372_2 5.74 +4 372_2 *375 0 +*END +*D_NET *376 0.00037488 +*CONN +*P *376 O +*I *377 I *L 0.0135592 +*I *378 I *L 0.0134094 +*CAP +1 376_1 0.00021984 +2 376_2 9.408e-05 +3 376_3 6.096e-05 +*RES +1 *376 376_1 2.17333 +2 376_1 376_2 2.61333 +3 376_2 *377 0 +4 376_1 376_3 1.02667 +5 376_3 *378 0 +*END +*D_NET *379 0.00042336 +*CONN +*I *380 O *D NOR2X1 +*I *381 I *L 0.0270702 +*I *382 I *L 0.0180033 +*CAP +1 379_1 0.00015528 +2 379_2 0.0001596 +3 379_3 0.00010848 +*RES +1 *380 379_1 3.31333 +2 379_1 379_2 1.54 +3 379_2 *381 0 +4 379_1 379_3 1.68 +5 379_3 *382 0 +*END +*D_NET *383 0.00024144 +*CONN +*I *384 O *D DFFSR +*I *385 I *L 0.0134147 +*I *386 I *L 0.0134094 +*CAP +1 383_1 8.64e-05 +2 383_2 0.00015504 +*RES +1 *384 383_1 0.56 +2 383_1 *385 0 +3 383_1 383_2 1.77333 +4 383_2 *386 0 +*END +*D_NET *387 0.00038928 +*CONN +*I *388 O *D DFFSR +*I *389 I *L 0.0134147 +*I *390 I *L 0.0134094 +*CAP +1 387_1 8.64e-05 +2 387_2 0.00030288 +*RES +1 *388 387_1 0.56 +2 387_1 *389 0 +3 387_1 387_2 4.57333 +4 387_2 *390 0 +*END +*D_NET *391 0.0005208 +*CONN +*I *392 O *D INVX1 +*I *393 I *L 0.0265339 +*I *394 I *L 0.0268633 +*CAP +1 391_1 0.0004344 +2 391_2 8.64e-05 +*RES +1 *392 391_1 6.06667 +2 391_1 *393 0 +3 391_1 391_2 0.56 +4 391_2 *394 0 +*END +*D_NET *395 0.00033096 +*CONN +*I *396 O *D DFFSR +*I *397 I *L 0.0134147 +*I *398 I *L 0.0134094 +*CAP +1 395_1 8.64e-05 +2 395_2 0.00024456 +*RES +1 *396 395_1 0.56 +2 395_1 *397 0 +3 395_1 395_2 3.12667 +4 395_2 *398 0 +*END +*D_NET *399 0.00013536 +*CONN +*I *400 O *D INVX1 +*I *401 I *L 0.0265339 +*I *402 I *L 0.0268633 +*CAP +1 399_1 2.016e-05 +2 399_2 0.0001152 +*RES +1 *400 399_1 0.56 +2 399_1 *401 0 +3 399_1 399_2 0.746667 +4 399_2 *402 0 +*END +*D_NET *403 0.00032256 +*CONN +*I *404 O *D DFFSR +*I *405 I *L 0.0134147 +*I *406 I *L 0.0134094 +*CAP +1 403_1 0.00020376 +2 403_2 5.76e-05 +3 403_3 6.12e-05 +*RES +1 *404 403_1 2.66 +2 403_1 403_2 0.373333 +3 403_2 *405 0 +4 403_1 403_3 0.7 +5 403_3 *406 0 +*END +*D_NET *407 0.000774 +*CONN +*I *408 O *D INVX1 +*I *409 I *L 0.0265339 +*I *410 I *L 0.0268633 +*CAP +1 407_1 0.00036096 +2 407_2 0.00041304 +*RES +1 *408 407_1 8.02667 +2 407_1 *409 0 +3 407_1 407_2 6.02 +4 407_2 *410 0 +*END +*D_NET *411 0.00024144 +*CONN +*I *412 O *D DFFSR +*I *413 I *L 0.0134147 +*I *414 I *L 0.0134094 +*CAP +1 411_1 8.64e-05 +2 411_2 0.00015504 +*RES +1 *412 411_1 0.56 +2 411_1 *413 0 +3 411_1 411_2 1.77333 +4 411_2 *414 0 +*END +*D_NET *415 0.00048192 +*CONN +*I *416 O *D INVX1 +*I *417 I *L 0.0265339 +*I *418 I *L 0.0268633 +*CAP +1 415_1 8.4e-06 +2 415_2 0.0001344 +3 415_3 0.00033912 +*RES +1 *416 415_1 0.233333 +2 415_1 415_2 1.86667 +3 415_2 *417 0 +4 415_1 415_3 6.58 +5 415_3 *418 0 +*END +*D_NET *419 0.00023424 +*CONN +*I *420 O *D DFFSR +*I *421 I *L 0.0134147 +*I *422 I *L 0.0134094 +*CAP +1 419_1 8.64e-05 +2 419_2 0.00014784 +*RES +1 *420 419_1 0.56 +2 419_1 *421 0 +3 419_1 419_2 4.10667 +4 419_2 *422 0 +*END +*D_NET *423 0.00022344 +*CONN +*I *424 O *D INVX1 +*I *425 I *L 0.0268633 +*I *426 I *L 0.0265339 +*CAP +1 423_1 4.704e-05 +2 423_2 8.16e-05 +3 423_3 9.48e-05 +*RES +1 *424 423_1 1.30667 +2 423_1 423_2 0.933333 +3 423_2 *425 0 +4 423_1 423_3 1.63333 +5 423_3 *426 0 +*END +*D_NET *427 0.00053952 +*CONN +*I *428 O *D DFFSR +*I *429 I *L 0.0134094 +*I *430 I *L 0.0134147 +*CAP +1 427_1 8.16e-05 +2 427_2 9.384e-05 +3 427_3 0.00036408 +*RES +1 *428 427_1 0.933333 +2 427_1 427_2 1.07333 +3 427_2 *429 0 +4 427_1 427_3 4.24667 +5 427_3 *430 0 +*END +*D_NET *431 0.0004224 +*CONN +*I *432 O *D INVX1 +*I *433 I *L 0.0268633 +*I *434 I *L 0.0265339 +*CAP +1 431_1 0.00026064 +2 431_2 1.344e-05 +3 431_3 0.00014832 +*RES +1 *432 431_1 3.24 +2 431_1 431_2 0.373333 +3 431_2 *433 0 +4 431_1 431_3 3.45333 +5 431_3 *434 0 +*END +*D_NET *435 0.00028992 +*CONN +*I *436 O *D DFFSR +*I *437 I *L 0.0134094 +*I *438 I *L 0.0134147 +*CAP +1 435_1 0 +2 435_2 0.00018864 +3 435_3 0.00010128 +*RES +1 *436 435_1 0 +2 435_1 435_2 4.57333 +3 435_2 *437 0 +4 435_1 435_3 2.14667 +5 435_3 *438 0 +*END +*D_NET *439 0.00060072 +*CONN +*I *440 O *D INVX1 +*I *441 I *L 0.0268633 +*I *442 I *L 0.0265339 +*CAP +1 439_1 0.00048216 +2 439_2 0.00011856 +*RES +1 *440 439_1 5.27333 +2 439_1 *441 0 +3 439_1 439_2 1.4 +4 439_2 *442 0 +*END +*D_NET *443 0.0003156 +*CONN +*I *444 O *D DFFSR +*I *445 I *L 0.0134147 +*I *446 I *L 0.0134094 +*CAP +1 443_1 0.0001632 +2 443_2 2.016e-05 +3 443_3 0.00013224 +*RES +1 *444 443_1 1.86667 +2 443_1 443_2 0.56 +3 443_2 *445 0 +4 443_1 443_3 1.44667 +5 443_3 *446 0 +*END +*D_NET *447 0.0002424 +*CONN +*I *448 O *D XNOR2X1 +*I *449 I *L 0.0265613 +*I *450 I *L 0.0265312 +*CAP +1 447_1 0.00012 +2 447_2 0.0001224 +*RES +1 *448 447_1 1.49333 +2 447_1 *449 0 +3 447_1 447_2 1.4 +4 447_2 *450 0 +*END +*D_NET *451 0.00039552 +*CONN +*I *452 O *D XNOR2X1 +*I *453 I *L 0.0270702 +*I *454 I *L 0.0268633 +*CAP +1 451_1 0.00017664 +2 451_2 3.36e-05 +3 451_3 0.00018528 +*RES +1 *452 451_1 2.24 +2 451_1 451_2 0.933333 +3 451_2 *453 0 +4 451_1 451_3 2.08 +5 451_3 *454 0 +*END +*D_NET *455 0.00021048 +*CONN +*P *455 O +*I *456 I *L 0.0180112 +*I *457 I *L 0.0227534 +*CAP +1 455_1 0.0001428 +2 455_2 0 +3 455_3 6.768e-05 +*RES +1 *455 455_1 1.63333 +2 455_1 455_2 0 +3 455_2 *456 0 +4 455_2 455_3 1.21333 +5 455_3 *457 0 +*END +*D_NET *458 0.00016896 +*CONN +*I *459 O *D INVX1 +*I *460 I *L 0.0177358 +*I *461 I *L 0.0222369 +*CAP +1 458_1 0.00011136 +2 458_2 5.76e-05 +*RES +1 *459 458_1 1.86667 +2 458_1 *460 0 +3 458_1 458_2 0.373333 +4 458_2 *461 0 +*END +*D_NET *462 0.0003192 +*CONN +*P *462 O +*I *463 I *L 0.0180101 +*I *464 I *L 0.0227534 +*CAP +1 462_1 0.0001896 +2 462_2 0.0001296 +*RES +1 *462 462_1 3.26667 +2 462_1 *463 0 +3 462_1 462_2 0.84 +4 462_2 *464 0 +*END +*D_NET *465 0.000606 +*CONN +*P *465 O +*I *466 I *L 0.0227534 +*I *467 I *L 0.0180101 +*CAP +1 465_1 2.016e-05 +2 465_2 0.00033624 +3 465_3 0.0002496 +*RES +1 *465 465_1 0.56 +2 465_1 465_2 3.78 +3 465_2 *466 0 +4 465_1 465_3 2.42667 +5 465_3 *467 0 +*END +*D_NET *468 0.0004404 +*CONN +*I *469 O *D INVX1 +*I *470 I *L 0.0222511 +*I *471 I *L 0.0265312 +*CAP +1 468_1 0.0001428 +2 468_2 2.04e-05 +3 468_3 0.0002772 +*RES +1 *469 468_1 1.63333 +2 468_1 468_2 0.233333 +3 468_2 *470 0 +4 468_2 468_3 3.5 +5 468_3 *471 0 +*END +*D_NET *472 0.000144 +*CONN +*I *473 O *D INVX1 +*I *474 I *L 0.0222511 +*I *475 I *L 0.0222511 +*CAP +1 472_1 8.64e-05 +2 472_2 5.76e-05 +*RES +1 *473 472_1 0.56 +2 472_1 *474 0 +3 472_1 472_2 0.373333 +4 472_2 *475 0 +*END +*D_NET *476 0.00035616 +*CONN +*I *477 O *D NOR2X1 +*I *478 I *L 0.0226301 +*I *479 I *L 0.0268737 +*CAP +1 476_1 0.00021384 +2 476_2 2.04e-05 +3 476_3 0.00012192 +*RES +1 *477 476_1 2.94 +2 476_1 476_2 0.233333 +3 476_2 *478 0 +4 476_2 476_3 2.05333 +5 476_3 *479 0 +*END +*D_NET *480 0.00041904 +*CONN +*P *480 O +*I *481 I *L 0.0134094 +*I *482 I *L 0.022204 +*CAP +1 480_1 2.016e-05 +2 480_2 0.0003312 +3 480_3 6.768e-05 +*RES +1 *480 480_1 0.56 +2 480_1 480_2 3.64 +3 480_2 *481 0 +4 480_1 480_3 1.21333 +5 480_3 *482 0 +*END +*D_NET *483 0.00054168 +*CONN +*I *484 O *D NAND3X1 +*I *485 I *L 0.0226301 +*I *486 I *L 0.0134094 +*CAP +1 483_1 0.000216 +2 483_2 0.00032568 +*RES +1 *484 483_1 1.4 +2 483_1 *485 0 +3 483_1 483_2 4.71333 +4 483_2 *486 0 +*END +*D_NET *487 0.00033936 +*CONN +*I *488 O *D DFFSR +*I *489 I *L 0.0134094 +*I *490 I *L 0.0134147 +*CAP +1 487_1 0 +2 487_2 2.688e-05 +3 487_3 0.00031248 +*RES +1 *488 487_1 0 +2 487_1 487_2 0.746667 +3 487_2 *489 0 +4 487_1 487_3 4.01333 +5 487_3 *490 0 +*END +*D_NET *491 0.0001224 +*CONN +*I *492 O *D NOR3X1 +*I *493 I *L 0.0226301 +*CAP +1 491_1 0.0001224 +*RES +1 *492 491_1 1.4 +2 491_1 *493 0 +*END +*D_NET *494 0.0001584 +*CONN +*I *495 O *D OAI21X1 +*I *496 I *L 0.0180112 +*CAP +1 494_1 0.0001584 +*RES +1 *495 494_1 1.02667 +2 494_1 *496 0 +*END +*D_NET *497 0.000252 +*CONN +*I *498 O *D NAND2X1 +*I *499 I *L 0.0135592 +*CAP +1 497_1 0.000252 +*RES +1 *498 497_1 3.26667 +2 497_1 *499 0 +*END +*D_NET *500 5.76e-05 +*CONN +*I *501 O *D INVX1 +*I *502 I *L 0.0265312 +*CAP +1 500_1 5.76e-05 +*RES +1 *501 500_1 0.373333 +2 500_1 *502 0 +*END +*D_NET *503 0.00016968 +*CONN +*I *504 O *D INVX1 +*I *505 I *L 0.0180101 +*CAP +1 503_1 0.00016968 +*RES +1 *504 503_1 2.38 +2 503_1 *505 0 +*END +*D_NET *506 0.0001632 +*CONN +*I *507 O *D INVX1 +*I *508 I *L 0.0227534 +*CAP +1 506_1 0.0001632 +*RES +1 *507 506_1 1.86667 +2 506_1 *508 0 +*END +*D_NET *509 0.000204 +*CONN +*I *510 O *D DFFSR +*I *511 I *L 0.0222369 +*CAP +1 509_1 0.000204 +*RES +1 *510 509_1 2.33333 +2 509_1 *511 0 +*END +*D_NET *512 0.00015168 +*CONN +*I *513 O *D OAI21X1 +*I *514 I *L 0.0135592 +*CAP +1 512_1 0.00015168 +*RES +1 *513 512_1 2.98667 +2 512_1 *514 0 +*END +*D_NET *515 5.76e-05 +*CONN +*I *516 O *D INVX1 +*I *517 I *L 0.0265613 +*CAP +1 515_1 5.76e-05 +*RES +1 *516 515_1 0.373333 +2 515_1 *517 0 +*END +*D_NET *518 0.00025128 +*CONN +*I *519 O *D NOR2X1 +*I *520 I *L 0.02277 +*CAP +1 518_1 0.00025128 +*RES +1 *519 518_1 3.31333 +2 518_1 *520 0 +*END +*D_NET *521 0.00016272 +*CONN +*I *522 O *D AOI21X1 +*I *523 I *L 0.0135592 +*CAP +1 521_1 0.00016272 +*RES +1 *522 521_1 2.85333 +2 521_1 *523 0 +*END +*D_NET *524 8.64e-05 +*CONN +*I *525 O *D INVX1 +*I *526 I *L 0.0265929 +*CAP +1 524_1 8.64e-05 +*RES +1 *525 524_1 0.56 +2 524_1 *526 0 +*END +*D_NET *527 0.00011808 +*CONN +*I *528 O *D MUX2X1 +*I *529 I *L 0.0135592 +*CAP +1 527_1 0.00011808 +*RES +1 *528 527_1 2.08 +2 527_1 *529 0 +*END +*D_NET *530 4.032e-05 +*CONN +*I *531 O *D INVX1 +*I *532 I *L 0.0265929 +*CAP +1 530_1 4.032e-05 +*RES +1 *531 530_1 1.12 +2 530_1 *532 0 +*END +*D_NET *533 0.00020376 +*CONN +*I *534 O *D MUX2X1 +*I *535 I *L 0.0135592 +*CAP +1 533_1 0.00020376 +*RES +1 *534 533_1 2.66 +2 533_1 *535 0 +*END +*D_NET *536 8.448e-05 +*CONN +*I *537 O *D INVX1 +*I *538 I *L 0.0265929 +*CAP +1 536_1 8.448e-05 +*RES +1 *537 536_1 1.12 +2 536_1 *538 0 +*END +*D_NET *539 0.00023088 +*CONN +*I *540 O *D MUX2X1 +*I *541 I *L 0.0135592 +*CAP +1 539_1 0.00023088 +*RES +1 *540 539_1 3.08 +2 539_1 *541 0 +*END +*D_NET *542 0.00010128 +*CONN +*I *543 O *D INVX1 +*I *544 I *L 0.0265929 +*CAP +1 542_1 0.00010128 +*RES +1 *543 542_1 2.14667 +2 542_1 *544 0 +*END +*D_NET *545 0.0001224 +*CONN +*I *546 O *D MUX2X1 +*I *547 I *L 0.0135592 +*CAP +1 545_1 0.0001224 +*RES +1 *546 545_1 1.4 +2 545_1 *547 0 +*END +*D_NET *548 0.0001632 +*CONN +*I *549 O *D INVX1 +*I *550 I *L 0.0265929 +*CAP +1 548_1 0.0001632 +*RES +1 *549 548_1 1.86667 +2 548_1 *550 0 +*END +*D_NET *551 0.00026424 +*CONN +*I *552 O *D MUX2X1 +*I *553 I *L 0.0135592 +*CAP +1 551_1 0.00026424 +*RES +1 *552 551_1 4.34 +2 551_1 *553 0 +*END +*D_NET *554 9.456e-05 +*CONN +*I *555 O *D INVX1 +*I *556 I *L 0.0265929 +*CAP +1 554_1 9.456e-05 +*RES +1 *555 554_1 1.96 +2 554_1 *556 0 +*END +*D_NET *557 7.104e-05 +*CONN +*I *558 O *D MUX2X1 +*I *559 I *L 0.0135592 +*CAP +1 557_1 7.104e-05 +*RES +1 *558 557_1 0.773333 +2 557_1 *559 0 +*END +*D_NET *560 8.64e-05 +*CONN +*I *561 O *D INVX1 +*I *562 I *L 0.0265929 +*CAP +1 560_1 8.64e-05 +*RES +1 *561 560_1 0.56 +2 560_1 *562 0 +*END +*D_NET *563 0.00013488 +*CONN +*I *564 O *D MUX2X1 +*I *565 I *L 0.0135592 +*CAP +1 563_1 0.00013488 +*RES +1 *564 563_1 3.08 +2 563_1 *565 0 +*END +*D_NET *566 3.36e-05 +*CONN +*I *567 O *D INVX1 +*I *568 I *L 0.0265613 +*CAP +1 566_1 3.36e-05 +*RES +1 *567 566_1 0.933333 +2 566_1 *568 0 +*END +*D_NET *569 9.792e-05 +*CONN +*P *569 O +*I *570 I *L 0.0222369 +*CAP +1 569_1 9.792e-05 +*RES +1 *569 569_1 2.05333 +2 569_1 *570 0 +*END +*D_NET *571 3.36e-05 +*CONN +*I *572 O *D NOR2X1 +*I *573 I *L 0.02277 +*CAP +1 571_1 3.36e-05 +*RES +1 *572 571_1 0.933333 +2 571_1 *573 0 +*END +*D_NET *574 0.00026448 +*CONN +*I *575 O *D AOI21X1 +*I *576 I *L 0.0135592 +*CAP +1 574_1 0.00026448 +*RES +1 *575 574_1 4.01333 +2 574_1 *576 0 +*END +*D_NET *577 0.00013296 +*CONN +*I *578 O *D OAI21X1 +*I *579 I *L 0.02277 +*CAP +1 577_1 0.00013296 +*RES +1 *578 577_1 2.22667 +2 577_1 *579 0 +*END +*D_NET *580 0.00012192 +*CONN +*I *581 O *D AOI21X1 +*I *582 I *L 0.0227534 +*CAP +1 580_1 0.00012192 +*RES +1 *581 580_1 2.05333 +2 580_1 *582 0 +*END +*D_NET *583 0.00022296 +*CONN +*I *584 O *D OAI21X1 +*I *585 I *L 0.0222369 +*CAP +1 583_1 0.00022296 +*RES +1 *584 583_1 4.52667 +2 583_1 *585 0 +*END +*D_NET *586 0.0001248 +*CONN +*I *587 O *D NOR2X1 +*I *588 I *L 0.0135592 +*CAP +1 586_1 0.0001248 +*RES +1 *587 586_1 2.24 +2 586_1 *588 0 +*END +*D_NET *589 5.76e-05 +*CONN +*I *590 O *D OAI21X1 +*I *591 I *L 0.02277 +*CAP +1 589_1 5.76e-05 +*RES +1 *590 589_1 0.373333 +2 589_1 *591 0 +*END +*D_NET *592 0.00026328 +*CONN +*I *593 O *D AOI21X1 +*I *594 I *L 0.0135592 +*CAP +1 592_1 0.00026328 +*RES +1 *593 592_1 5.08667 +2 592_1 *594 0 +*END +*D_NET *595 5.76e-05 +*CONN +*I *596 O *D OAI21X1 +*I *597 I *L 0.02277 +*CAP +1 595_1 5.76e-05 +*RES +1 *596 595_1 0.373333 +2 595_1 *597 0 +*END +*D_NET *598 0.0001008 +*CONN +*I *599 O *D AOI21X1 +*I *600 I *L 0.0135592 +*CAP +1 598_1 0.0001008 +*RES +1 *599 598_1 2.8 +2 598_1 *600 0 +*END +*D_NET *601 5.76e-05 +*CONN +*I *602 O *D OAI21X1 +*I *603 I *L 0.02277 +*CAP +1 601_1 5.76e-05 +*RES +1 *602 601_1 0.373333 +2 601_1 *603 0 +*END +*D_NET *604 0.0001416 +*CONN +*I *605 O *D AOI21X1 +*I *606 I *L 0.0135592 +*CAP +1 604_1 0.0001416 +*RES +1 *605 604_1 3.26667 +2 604_1 *606 0 +*END +*D_NET *607 0.00010824 +*CONN +*I *608 O *D OAI21X1 +*I *609 I *L 0.02277 +*CAP +1 607_1 0.00010824 +*RES +1 *608 607_1 2.00667 +2 607_1 *609 0 +*END +*D_NET *610 0.00033216 +*CONN +*I *611 O *D AOI21X1 +*I *612 I *L 0.0135592 +*CAP +1 610_1 0.00033216 +*RES +1 *611 610_1 4.16 +2 610_1 *612 0 +*END +*D_NET *613 5.76e-05 +*CONN +*I *614 O *D OAI21X1 +*I *615 I *L 0.02277 +*CAP +1 613_1 5.76e-05 +*RES +1 *614 613_1 0.373333 +2 613_1 *615 0 +*END +*D_NET *616 0.00012 +*CONN +*I *617 O *D AOI21X1 +*I *618 I *L 0.0135592 +*CAP +1 616_1 0.00012 +*RES +1 *617 616_1 1.2 +2 616_1 *618 0 +*END +*D_NET *619 5.76e-05 +*CONN +*I *620 O *D OAI21X1 +*I *621 I *L 0.02277 +*CAP +1 619_1 5.76e-05 +*RES +1 *620 619_1 0.373333 +2 619_1 *621 0 +*END +*D_NET *622 0.00016128 +*CONN +*I *623 O *D AOI21X1 +*I *624 I *L 0.0135592 +*CAP +1 622_1 0.00016128 +*RES +1 *623 622_1 4.48 +2 622_1 *624 0 +*END +*D_NET *625 0.00052128 +*CONN +*I *626 O *D INVX1 +*I *627 I *L 0.0270702 +*CAP +1 625_1 0.00052128 +*RES +1 *626 625_1 11.9467 +2 625_1 *627 0 +*END +*D_NET *628 8.64e-05 +*CONN +*I *629 O *D AND2X2 +*I *630 I *L 0.0270702 +*CAP +1 628_1 8.64e-05 +*RES +1 *629 628_1 0.56 +2 628_1 *630 0 +*END +*D_NET *631 0.0001152 +*CONN +*I *632 O *D OAI21X1 +*I *633 I *L 0.0180101 +*CAP +1 631_1 0.0001152 +*RES +1 *632 631_1 1.86667 +2 631_1 *633 0 +*END +*D_NET *634 0.00016872 +*CONN +*I *635 O *D OAI21X1 +*I *636 I *L 0.0135592 +*CAP +1 634_1 0.00016872 +*RES +1 *635 634_1 3.68667 +2 634_1 *636 0 +*END +*D_NET *637 8.64e-05 +*CONN +*I *638 O *D NOR2X1 +*I *639 I *L 0.0265312 +*CAP +1 637_1 8.64e-05 +*RES +1 *638 637_1 0.56 +2 637_1 *639 0 +*END +*D_NET *640 0.00046416 +*CONN +*I *641 O *D OAI21X1 +*I *642 I *L 0.0177118 +*CAP +1 640_1 0.00046416 +*RES +1 *641 640_1 5.50667 +2 640_1 *642 0 +*END +*D_NET *643 6.72e-05 +*CONN +*I *644 O *D NOR2X1 +*I *645 I *L 0.0265312 +*CAP +1 643_1 6.72e-05 +*RES +1 *644 643_1 1.86667 +2 643_1 *645 0 +*END +*D_NET *646 0.0001584 +*CONN +*I *647 O *D OAI21X1 +*I *648 I *L 0.0180112 +*CAP +1 646_1 0.0001584 +*RES +1 *647 646_1 1.02667 +2 646_1 *648 0 +*END +*D_NET *649 0.00034416 +*CONN +*I *650 O *D NAND2X1 +*I *651 I *L 0.0135592 +*CAP +1 649_1 0.00034416 +*RES +1 *650 649_1 7.56 +2 649_1 *651 0 +*END +*D_NET *652 3.36e-05 +*CONN +*I *653 O *D AOI21X1 +*I *654 I *L 0.0180101 +*CAP +1 652_1 3.36e-05 +*RES +1 *653 652_1 0.933333 +2 652_1 *654 0 +*END +*D_NET *655 0.00015408 +*CONN +*I *656 O *D OAI21X1 +*I *657 I *L 0.0180101 +*CAP +1 655_1 0.00015408 +*RES +1 *656 655_1 1.77333 +2 655_1 *657 0 +*END +*D_NET *658 0.00021696 +*CONN +*I *659 O *D XNOR2X1 +*I *660 I *L 0.0270702 +*CAP +1 658_1 0.00021696 +*RES +1 *659 658_1 2.24 +2 658_1 *660 0 +*END +*D_NET *661 0.000246 +*CONN +*I *662 O *D OAI21X1 +*I *663 I *L 0.0135592 +*CAP +1 661_1 0.000246 +*RES +1 *662 661_1 5.83333 +2 661_1 *663 0 +*END +*D_NET *664 0.0002304 +*CONN +*I *665 O *D OAI21X1 +*I *666 I *L 0.0180112 +*CAP +1 664_1 0.0002304 +*RES +1 *665 664_1 3.73333 +2 664_1 *666 0 +*END +*D_NET *667 0.0001152 +*CONN +*I *668 O *D NAND2X1 +*I *669 I *L 0.0268737 +*CAP +1 667_1 0.0001152 +*RES +1 *668 667_1 0.746667 +2 667_1 *669 0 +*END +*D_NET *670 5.76e-05 +*CONN +*I *671 O *D INVX1 +*I *672 I *L 0.0177118 +*CAP +1 670_1 5.76e-05 +*RES +1 *671 670_1 0.373333 +2 670_1 *672 0 +*END +*D_NET *673 8.64e-05 +*CONN +*I *674 O *D NAND2X1 +*I *675 I *L 0.0265613 +*CAP +1 673_1 8.64e-05 +*RES +1 *674 673_1 0.56 +2 673_1 *675 0 +*END +*D_NET *676 0.00030504 +*CONN +*I *677 O *D AOI21X1 +*I *678 I *L 0.0273706 +*CAP +1 676_1 0.00030504 +*RES +1 *677 676_1 4.07333 +2 676_1 *678 0 +*END +*D_NET *679 0.0001512 +*CONN +*I *680 O *D AOI22X1 +*I *681 I *L 0.0135592 +*CAP +1 679_1 0.0001512 +*RES +1 *680 679_1 4.2 +2 679_1 *681 0 +*END +*D_NET *682 5.76e-05 +*CONN +*I *683 O *D INVX1 +*I *684 I *L 0.02277 +*CAP +1 682_1 5.76e-05 +*RES +1 *683 682_1 0.373333 +2 682_1 *684 0 +*END +*D_NET *685 6.768e-05 +*CONN +*I *686 O *D AOI21X1 +*I *687 I *L 0.0265291 +*CAP +1 685_1 6.768e-05 +*RES +1 *686 685_1 1.21333 +2 685_1 *687 0 +*END +*D_NET *688 0.00021624 +*CONN +*I *689 O *D OAI21X1 +*I *690 I *L 0.0271075 +*CAP +1 688_1 0.00021624 +*RES +1 *689 688_1 2.47333 +2 688_1 *690 0 +*END +*D_NET *691 3.36e-05 +*CONN +*I *692 O *D XNOR2X1 +*I *693 I *L 0.027353 +*CAP +1 691_1 3.36e-05 +*RES +1 *692 691_1 0.933333 +2 691_1 *693 0 +*END +*D_NET *694 0.00028944 +*CONN +*I *695 O *D OAI22X1 +*I *696 I *L 0.0135592 +*CAP +1 694_1 0.00028944 +*RES +1 *695 694_1 7.37333 +2 694_1 *696 0 +*END +*D_NET *697 0.000342 +*CONN +*I *698 O *D NOR2X1 +*I *699 I *L 0.0226301 +*CAP +1 697_1 0.000342 +*RES +1 *698 697_1 2.83333 +2 697_1 *699 0 +*END +*D_NET *700 4.032e-05 +*CONN +*I *701 O *D OAI21X1 +*I *702 I *L 0.0180112 +*CAP +1 700_1 4.032e-05 +*RES +1 *701 700_1 1.12 +2 700_1 *702 0 +*END +*D_NET *703 0.00064488 +*CONN +*I *704 O *D NAND2X1 +*I *705 I *L 0.0270702 +*CAP +1 703_1 0.00064488 +*RES +1 *704 703_1 6.64667 +2 703_1 *705 0 +*END +*D_NET *706 0.0001224 +*CONN +*I *707 O *D NOR3X1 +*I *708 I *L 0.0265312 +*CAP +1 706_1 0.0001224 +*RES +1 *707 706_1 1.4 +2 706_1 *708 0 +*END +*D_NET *709 6.768e-05 +*CONN +*I *710 O *D OAI21X1 +*I *711 I *L 0.0134094 +*CAP +1 709_1 6.768e-05 +*RES +1 *710 709_1 1.21333 +2 709_1 *711 0 +*END +*D_NET *712 8.64e-05 +*CONN +*I *713 O *D INVX1 +*I *714 I *L 0.0270702 +*CAP +1 712_1 8.64e-05 +*RES +1 *713 712_1 0.56 +2 712_1 *714 0 +*END +*D_NET *715 0.00021696 +*CONN +*I *716 O *D OAI21X1 +*I *717 I *L 0.0180101 +*CAP +1 715_1 0.00021696 +*RES +1 *716 715_1 3.36 +2 715_1 *717 0 +*END +*D_NET *718 0.00022128 +*CONN +*I *719 O *D OAI21X1 +*I *720 I *L 0.0135592 +*CAP +1 718_1 0.00022128 +*RES +1 *719 718_1 3.64 +2 718_1 *720 0 +*END +*D_NET *721 5.76e-05 +*CONN +*I *722 O *D OAI21X1 +*I *723 I *L 0.0134094 +*CAP +1 721_1 5.76e-05 +*RES +1 *722 721_1 0.373333 +2 721_1 *723 0 +*END +*D_NET *724 7.44e-05 +*CONN +*I *725 O *D INVX1 +*I *726 I *L 0.0180101 +*CAP +1 724_1 7.44e-05 +*RES +1 *725 724_1 1.4 +2 724_1 *726 0 +*END +*D_NET *727 0.00018336 +*CONN +*I *728 O *D OAI21X1 +*I *729 I *L 0.0180101 +*CAP +1 727_1 0.00018336 +*RES +1 *728 727_1 2.42667 +2 727_1 *729 0 +*END +*D_NET *730 0.00019008 +*CONN +*I *731 O *D NAND2X1 +*I *732 I *L 0.0227534 +*CAP +1 730_1 0.00019008 +*RES +1 *731 730_1 2.61333 +2 730_1 *732 0 +*END +*D_NET *733 2.016e-05 +*CONN +*I *734 O *D INVX1 +*I *735 I *L 0.0226301 +*CAP +1 733_1 2.016e-05 +*RES +1 *734 733_1 0.56 +2 733_1 *735 0 +*END +*D_NET *736 6.768e-05 +*CONN +*I *737 O *D NAND3X1 +*I *738 I *L 0.0222369 +*CAP +1 736_1 6.768e-05 +*RES +1 *737 736_1 1.21333 +2 736_1 *738 0 +*END +*D_NET *739 0.00053664 +*CONN +*I *740 O *D INVX1 +*I *741 I *L 0.0226301 +*CAP +1 739_1 0.00053664 +*RES +1 *740 739_1 6.04 +2 739_1 *741 0 +*END +*D_NET *742 0.0001764 +*CONN +*I *743 O *D NAND3X1 +*I *744 I *L 0.0273706 +*CAP +1 742_1 0.0001764 +*RES +1 *743 742_1 2.56667 +2 742_1 *744 0 +*END +*D_NET *745 0.00010152 +*CONN +*I *746 O *D AOI22X1 +*I *747 I *L 0.0270702 +*CAP +1 745_1 0.00010152 +*RES +1 *746 745_1 1.82 +2 745_1 *747 0 +*END +*D_NET *748 0.00034224 +*CONN +*I *749 O *D OAI21X1 +*I *750 I *L 0.0135592 +*CAP +1 748_1 0.00034224 +*RES +1 *749 748_1 5.30667 +2 748_1 *750 0 +*END +*D_NET *751 0.0018144 +*CONN +*I *752 O *D INVX1 +*I *753 I *L 0.0180101 +*CAP +1 751_1 0.0018144 +*RES +1 *752 751_1 21.28 +2 751_1 *753 0 +*END +*D_NET *754 0.00125544 +*CONN +*I *755 O *D OAI21X1 +*I *756 I *L 0.022204 +*CAP +1 754_1 0.00125544 +*RES +1 *755 754_1 15.8067 +2 754_1 *756 0 +*END +*D_NET *757 6.768e-05 +*CONN +*I *758 O *D NAND3X1 +*I *759 I *L 0.0226301 +*CAP +1 757_1 6.768e-05 +*RES +1 *758 757_1 1.21333 +2 757_1 *759 0 +*END +*D_NET *760 0.00023736 +*CONN +*I *761 O *D NAND3X1 +*I *762 I *L 0.0177358 +*CAP +1 760_1 0.00023736 +*RES +1 *761 760_1 3.59333 +2 760_1 *762 0 +*END +*D_NET *763 2.688e-05 +*CONN +*I *764 O *D INVX1 +*I *765 I *L 0.022204 +*CAP +1 763_1 2.688e-05 +*RES +1 *764 763_1 0.746667 +2 763_1 *765 0 +*END +*D_NET *766 0.00021696 +*CONN +*I *767 O *D OAI21X1 +*I *768 I *L 0.022204 +*CAP +1 766_1 0.00021696 +*RES +1 *767 766_1 3.36 +2 766_1 *768 0 +*END +*D_NET *769 0.00047784 +*CONN +*I *770 O *D NAND3X1 +*I *771 I *L 0.0180033 +*CAP +1 769_1 0.00047784 +*RES +1 *770 769_1 6.34 +2 769_1 *771 0 +*END +*D_NET *772 0.00020256 +*CONN +*I *773 O *D AND2X2 +*I *774 I *L 0.0135592 +*CAP +1 772_1 0.00020256 +*RES +1 *773 772_1 4.29333 +2 772_1 *774 0 +*END +*D_NET *775 0.00028008 +*CONN +*I *776 O *D INVX1 +*I *777 I *L 0.0268633 +*CAP +1 775_1 0.00028008 +*RES +1 *776 775_1 3.68667 +2 775_1 *777 0 +*END +*D_NET *778 2.016e-05 +*CONN +*I *779 O *D INVX1 +*I *780 I *L 0.0226301 +*CAP +1 778_1 2.016e-05 +*RES +1 *779 778_1 0.56 +2 778_1 *780 0 +*END +*D_NET *781 0.00019008 +*CONN +*I *782 O *D NAND3X1 +*I *783 I *L 0.0265613 +*CAP +1 781_1 0.00019008 +*RES +1 *782 781_1 2.61333 +2 781_1 *783 0 +*END +*D_NET *784 0.00014664 +*CONN +*I *785 O *D AOI21X1 +*I *786 I *L 0.0135592 +*CAP +1 784_1 0.00014664 +*RES +1 *785 784_1 2.27333 +2 784_1 *786 0 +*END +*D_NET *787 5.76e-05 +*CONN +*I *788 O *D OAI21X1 +*I *789 I *L 0.02277 +*CAP +1 787_1 5.76e-05 +*RES +1 *788 787_1 0.373333 +2 787_1 *789 0 +*END +*D_NET *790 0.00015768 +*CONN +*I *791 O *D AOI21X1 +*I *792 I *L 0.0135592 +*CAP +1 790_1 0.00015768 +*RES +1 *791 790_1 2.11333 +2 790_1 *792 0 +*END +*D_NET *793 0.00013992 +*CONN +*I *794 O *D AND2X2 +*I *795 I *L 0.0135592 +*CAP +1 793_1 0.00013992 +*RES +1 *794 793_1 2.08667 +2 793_1 *795 0 +*END +*D_NET *796 0.00017472 +*CONN +*I *797 O *D INVX1 +*I *798 I *L 0.0135592 +*CAP +1 796_1 0.00017472 +*RES +1 *797 796_1 4.85333 +2 796_1 *798 0 +*END +*D_NET *799 0.00016464 +*CONN +*P *799 O +*I *800 I *L 0.109759 +*CAP +1 799_1 0.00016464 +*RES +1 *799 799_1 2.10667 +2 799_1 *800 0 +*END +*D_NET *801 0.00011424 +*CONN +*I *802 O *D BUFX2 +*P *801 I +*CAP +1 801_1 0.00011424 +*RES +1 *802 801_1 1.30667 +2 801_1 *801 0 +*END +*D_NET *803 0.00011424 +*CONN +*I *804 O *D BUFX2 +*P *803 I +*CAP +1 803_1 0.00011424 +*RES +1 *804 803_1 1.30667 +2 803_1 *803 0 +*END +*D_NET *805 6.768e-05 +*CONN +*I *806 O *D BUFX2 +*P *805 I +*CAP +1 805_1 6.768e-05 +*RES +1 *806 805_1 1.21333 +2 805_1 *805 0 +*END +*D_NET *807 0.00011424 +*CONN +*I *808 O *D BUFX2 +*P *807 I +*CAP +1 807_1 0.00011424 +*RES +1 *808 807_1 1.30667 +2 807_1 *807 0 +*END +*D_NET *809 0.00011856 +*CONN +*I *810 O *D BUFX2 +*P *809 I +*CAP +1 809_1 0.00011856 +*RES +1 *810 809_1 1.4 +2 809_1 *809 0 +*END +*D_NET *811 9.456e-05 +*CONN +*I *812 O *D BUFX2 +*P *811 I +*CAP +1 811_1 9.456e-05 +*RES +1 *812 811_1 1.96 +2 811_1 *811 0 +*END +*D_NET *813 0.00011424 +*CONN +*I *814 O *D BUFX2 +*P *813 I +*CAP +1 813_1 0.00011424 +*RES +1 *814 813_1 1.30667 +2 813_1 *813 0 +*END +*D_NET *815 0.00011424 +*CONN +*I *816 O *D BUFX2 +*P *815 I +*CAP +1 815_1 0.00011424 +*RES +1 *816 815_1 1.30667 +2 815_1 *815 0 +*END +*D_NET *817 0.00011424 +*CONN +*I *818 O *D BUFX2 +*P *817 I +*CAP +1 817_1 0.00011424 +*RES +1 *818 817_1 1.30667 +2 817_1 *817 0 +*END +*D_NET *819 2.016e-05 +*CONN +*I *820 O *D BUFX2 +*P *819 I +*CAP +1 819_1 2.016e-05 +*RES +1 *820 819_1 0.56 +2 819_1 *819 0 +*END +*D_NET *821 6.096e-05 +*CONN +*I *822 O *D BUFX2 +*P *821 I +*CAP +1 821_1 6.096e-05 +*RES +1 *822 821_1 1.02667 +2 821_1 *821 0 +*END +*D_NET *823 0.00011424 +*CONN +*I *824 O *D BUFX2 +*P *823 I +*CAP +1 823_1 0.00011424 +*RES +1 *824 823_1 1.30667 +2 823_1 *823 0 +*END +*D_NET *825 0.00011424 +*CONN +*I *826 O *D BUFX2 +*P *825 I +*CAP +1 825_1 0.00011424 +*RES +1 *826 825_1 1.30667 +2 825_1 *825 0 +*END +*D_NET *827 6.096e-05 +*CONN +*I *828 O *D BUFX2 +*P *827 I +*CAP +1 827_1 6.096e-05 +*RES +1 *828 827_1 1.02667 +2 827_1 *827 0 +*END +*D_NET *829 6.096e-05 +*CONN +*I *830 O *D BUFX2 +*P *829 I +*CAP +1 829_1 6.096e-05 +*RES +1 *830 829_1 1.02667 +2 829_1 *829 0 +*END +*D_NET *831 6.096e-05 +*CONN +*I *832 O *D BUFX2 +*P *831 I +*CAP +1 831_1 6.096e-05 +*RES +1 *832 831_1 1.02667 +2 831_1 *831 0 +*END +*D_NET *833 0.00033864 +*CONN +*I *834 O *D BUFX2 +*P *833 I +*CAP +1 833_1 0.00033864 +*RES +1 *834 833_1 3.87333 +2 833_1 *833 0 +*END +*D_NET *835 6.096e-05 +*CONN +*I *836 O *D BUFX2 +*P *835 I +*CAP +1 835_1 6.096e-05 +*RES +1 *836 835_1 1.02667 +2 835_1 *835 0 +*END +*D_NET *837 6.096e-05 +*CONN +*I *838 O *D BUFX2 +*P *837 I +*CAP +1 837_1 6.096e-05 +*RES +1 *838 837_1 1.02667 +2 837_1 *837 0 +*END +*D_NET *839 0.00011424 +*CONN +*I *840 O *D BUFX2 +*P *839 I +*CAP +1 839_1 0.00011424 +*RES +1 *840 839_1 1.30667 +2 839_1 *839 0 +*END +*D_NET *841 0.00011424 +*CONN +*I *842 O *D BUFX2 +*P *841 I +*CAP +1 841_1 0.00011424 +*RES +1 *842 841_1 1.30667 +2 841_1 *841 0 +*END +*D_NET *843 0.00011424 +*CONN +*I *844 O *D BUFX2 +*P *843 I +*CAP +1 843_1 0.00011424 +*RES +1 *844 843_1 1.30667 +2 843_1 *843 0 +*END +*D_NET *845 6.096e-05 +*CONN +*I *846 O *D BUFX2 +*P *845 I +*CAP +1 845_1 6.096e-05 +*RES +1 *846 845_1 1.02667 +2 845_1 *845 0 +*END +*D_NET *847 0.00036624 +*CONN +*I *848 O *D BUFX2 +*P *847 I +*CAP +1 847_1 0.00036624 +*RES +1 *848 847_1 3.18667 +2 847_1 *847 0 +*END +*D_NET *849 0.0001008 +*CONN +*I *850 O *D BUFX2 +*P *849 I +*CAP +1 849_1 0.0001008 +*RES +1 *850 849_1 2.8 +2 849_1 *849 0 +*END +*D_NET *851 0.00011424 +*CONN +*I *852 O *D BUFX2 +*P *851 I +*CAP +1 851_1 0.00011424 +*RES +1 *852 851_1 1.30667 +2 851_1 *851 0 +*END |