mirror of
https://github.com/RTimothyEdwards/netgen.git
synced 2026-08-27 08:26:49 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45164bbf98 | ||
|
|
2ee286efb4 | ||
|
|
46cb8d6637 | ||
|
|
dae6919d4f | ||
|
|
017bdc6e48 | ||
|
|
2825b786b7 | ||
|
|
b371af9235 | ||
|
|
0af8c7ad49 | ||
|
|
b5432d139b | ||
|
|
0aa20dcf62 | ||
|
|
0e958bd45c |
+53
-14
@@ -1756,6 +1756,11 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
flattenInstancesOf(name1, file1, ecomp->cell1->name);
|
||||
modified1++;
|
||||
}
|
||||
else if (ecomp->cell1 && (ecomp->num1 > 0)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell1->name, name1, file1);
|
||||
}
|
||||
if (ecomp->cell2 && (ecomp->num2 > 0) &&
|
||||
(!(ecomp->cell2->flags & CELL_PLACEHOLDER))) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
@@ -1764,6 +1769,11 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
flattenInstancesOf(name2, file2, ecomp->cell2->name);
|
||||
modified2++;
|
||||
}
|
||||
else if (ecomp->cell2 && (ecomp->num2 > 0)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell2->name, name2, file2);
|
||||
}
|
||||
}
|
||||
|
||||
/* Reset or apply the count adjustments */
|
||||
@@ -1854,6 +1864,11 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
flattenInstancesOf(name2, file2, ecomp->cell2->name);
|
||||
modified2++;
|
||||
}
|
||||
else if (ecomp->cell2) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell2->name, name2, file2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1920,6 +1935,11 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
flattenInstancesOf(name1, file1, ecomp->cell1->name);
|
||||
modified1++;
|
||||
}
|
||||
else if (ecomp->cell1) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s (%d)"
|
||||
" would make a better match but is prohibited.\n",
|
||||
ecomp->cell1->name, name1, file1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2271,13 +2291,23 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
ecompX0->cell1->file, &compdict);
|
||||
if (dstr) *dstr = '[';
|
||||
if ((ncomp == ecomp0X) && (ecomp0X->num2 <= ecompX0->num1)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s"
|
||||
"(%d) makes a better match\n",
|
||||
ecompX0->cell1->name, name1, file1);
|
||||
flattenInstancesOf(name1, file1, ecompX0->cell1->name);
|
||||
ecompX0->num1 = 0;
|
||||
ecomp0X->num1 += ecompX0->num1;
|
||||
modified1++;
|
||||
if (!(ecompX0->cell1->flags & CELL_PLACEHOLDER)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell"
|
||||
" %s (%d) makes a better match\n",
|
||||
ecompX0->cell1->name, name1, file1);
|
||||
flattenInstancesOf(name1, file1,
|
||||
ecompX0->cell1->name);
|
||||
ecompX0->num1 = 0;
|
||||
ecomp0X->num1 += ecompX0->num1;
|
||||
modified1++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Fprintf(stdout, "Flattening instances of %s in "
|
||||
"cell %s (%d) would make a better "
|
||||
"match but is prohibited.\n",
|
||||
ecompX0->cell1->name, name1, file1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2297,13 +2327,22 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
|
||||
ecomp0X->cell2->file, &compdict);
|
||||
if (dstr) *dstr = '[';
|
||||
if ((ncomp == ecompX0) && (ecompX0->num1 <= ecomp0X->num2)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell %s"
|
||||
" (%d) makes a better match\n",
|
||||
ecomp0X->cell2->name, name2, file2);
|
||||
flattenInstancesOf(name2, file2, ecomp0X->cell2->name);
|
||||
ecomp0X->num2 = 0;
|
||||
ecompX0->num2 += ecomp0X->num2;
|
||||
modified2++;
|
||||
if (!(ecomp0X->cell2->flags & CELL_PLACEHOLDER)) {
|
||||
Fprintf(stdout, "Flattening instances of %s in cell"
|
||||
" %s (%d) makes a better match\n",
|
||||
ecomp0X->cell2->name, name2, file2);
|
||||
flattenInstancesOf(name2, file2,
|
||||
ecomp0X->cell2->name);
|
||||
ecomp0X->num2 = 0;
|
||||
ecompX0->num2 += ecomp0X->num2;
|
||||
modified2++;
|
||||
}
|
||||
else {
|
||||
Fprintf(stdout, "Flattening instances of %s in "
|
||||
"cell %s (%d) would make a better "
|
||||
"match but is prohibited.\n",
|
||||
ecompX0->cell2->name, name2, file2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+20
-4
@@ -8009,21 +8009,21 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
*/
|
||||
for (permute1 = tc1->permutes; permute1; permute1 = permute1->next) {
|
||||
if ((*matchfunc)(ob1->name, permute1->pin1)) {
|
||||
ob1a = LookupObject(permute1->pin1, tc1);
|
||||
ob2a = LookupObject(permute1->pin2, tc2);
|
||||
break;
|
||||
}
|
||||
else if ((*matchfunc)(ob1->name, permute1->pin2)) {
|
||||
ob1a = LookupObject(permute1->pin2, tc1);
|
||||
ob2a = LookupObject(permute1->pin1, tc2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (permute2 = tc2->permutes; permute2; permute2 = permute2->next) {
|
||||
if ((*matchfunc)(ob2->name, permute2->pin1)) {
|
||||
ob2a = LookupObject(permute2->pin1, tc2);
|
||||
ob1a = LookupObject(permute2->pin2, tc1);
|
||||
break;
|
||||
}
|
||||
else if ((*matchfunc)(ob2->name, permute2->pin2)) {
|
||||
ob2a = LookupObject(permute2->pin2, tc2);
|
||||
ob1a = LookupObject(permute2->pin1, tc1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -8196,6 +8196,14 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
hasproxy1 = 1;
|
||||
|
||||
HashPtrInstall(obn->name, obn, &(tc1->objdict));
|
||||
|
||||
/* If this is a black-box circuit, then the pin has not been output */
|
||||
if (NodeClasses == NULL) {
|
||||
output_string_fill(ostr);
|
||||
output_string_left(ostr, "%s", "(no matching pin)");
|
||||
output_string_right(ostr, "%s", ob2->name);
|
||||
output_string_print(ostr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8266,6 +8274,14 @@ int MatchPins(struct nlist *tc1, struct nlist *tc2, int dolist)
|
||||
hasproxy2 = 1;
|
||||
|
||||
HashPtrInstall(obn->name, obn, &(tc2->objdict));
|
||||
|
||||
/* If this is a black-box circuit, then the pin has not been output */
|
||||
if (NodeClasses == NULL) {
|
||||
output_string_fill(ostr);
|
||||
output_string_left(ostr, "%s", ob1->name);
|
||||
output_string_right(ostr, "%s", "(no matching pin)");
|
||||
output_string_print(ostr);
|
||||
}
|
||||
}
|
||||
|
||||
else if (ob1 != NULL && ob1->type == PORT && ob1->node < 0) {
|
||||
|
||||
+1
-1
@@ -302,7 +302,7 @@ int GetNextLineNoNewline(char *delimiter)
|
||||
{
|
||||
char *newbuf;
|
||||
int testc;
|
||||
int nested = 0;
|
||||
static int nested = 0;
|
||||
int llen;
|
||||
|
||||
if (feof(infile)) return -1;
|
||||
|
||||
+7
-5
@@ -2614,13 +2614,15 @@ nextinst:
|
||||
if (scan == NULL) {
|
||||
char localnet[MAX_STR_LEN];
|
||||
|
||||
/* Assume an implicit unconnected pin */
|
||||
sprintf(localnet, "_noconnect_%d_", localcount++);
|
||||
Node(localnet);
|
||||
join(localnet, obptr->name);
|
||||
Fprintf(stdout,
|
||||
/* Assume an implicit unconnected pin, unless there are no pins */
|
||||
if (strcmp(obpinname, "(no pins)")) {
|
||||
sprintf(localnet, "_noconnect_%d_", localcount++);
|
||||
Node(localnet);
|
||||
join(localnet, obptr->name);
|
||||
Fprintf(stdout,
|
||||
"Note: Implicit pin %s in instance %s of %s in cell %s\n",
|
||||
obpinname, locinst, modulename, CurrentCell->name);
|
||||
}
|
||||
}
|
||||
else if (GetBus(scan->net, &wb) == 0) {
|
||||
char *bptr2;
|
||||
|
||||
@@ -477,6 +477,18 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
|
||||
set cell2 [lindex $clist2 $cidx]
|
||||
}
|
||||
|
||||
# The "noflat" list is non-file-specific, so run on each file.
|
||||
foreach cell $noflat {
|
||||
set cidx [lsearch -regexp $clist1 ^$cell$]
|
||||
if {$cidx >= 0} {
|
||||
netgen::flatten prohibit "$fnum1 $cell"
|
||||
}
|
||||
set cidx [lsearch -regexp $clist2 ^$cell$]
|
||||
if {$cidx >= 0} {
|
||||
netgen::flatten prohibit "$fnum2 $cell"
|
||||
}
|
||||
}
|
||||
|
||||
netgen::compare assign "$fnum1 $cell1" "$fnum2 $cell2"
|
||||
|
||||
if {$setupfile == ""} {
|
||||
|
||||
+12
-8
@@ -1021,7 +1021,7 @@ _netgen_flatten(ClientData clientData,
|
||||
{
|
||||
char *repstr, *file;
|
||||
int result, llen, filenum;
|
||||
struct nlist *tp, *tp2;
|
||||
struct nlist *tp, *tp2, *tptop;
|
||||
|
||||
if ((objc < 2) || (objc > 4)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?class? valid_cellname");
|
||||
@@ -1035,7 +1035,7 @@ _netgen_flatten(ClientData clientData,
|
||||
if (objc >= 3) {
|
||||
char *argv = Tcl_GetString(objv[1]);
|
||||
if (!strcmp(argv, "class")) {
|
||||
tp = GetTopCell(filenum);
|
||||
tptop = GetTopCell(filenum);
|
||||
|
||||
if (objc == 4) {
|
||||
int numflat;
|
||||
@@ -1046,7 +1046,7 @@ _netgen_flatten(ClientData clientData,
|
||||
}
|
||||
else {
|
||||
Printf("Flattening instances of %s in cell %s within file %s\n",
|
||||
repstr, tp2->name, tp->name);
|
||||
repstr, tp2->name, tptop->name);
|
||||
numflat = flattenInstancesOf(tp2->name, filenum, repstr);
|
||||
if (numflat == 0) {
|
||||
Tcl_SetResult(interp, "No instances found to flatten.", NULL);
|
||||
@@ -1055,15 +1055,19 @@ _netgen_flatten(ClientData clientData,
|
||||
}
|
||||
}
|
||||
else {
|
||||
Printf("Flattening instances of %s in file %s\n", repstr, tp->name);
|
||||
Printf("Flattening instances of %s in file %s\n", repstr, tptop->name);
|
||||
FlattenInstancesOf(repstr, filenum);
|
||||
}
|
||||
}
|
||||
else if (!strcmp(argv, "prohibit") || !strcmp(argv, "deny")) {
|
||||
tp = GetTopCell(filenum);
|
||||
Printf("Will not flatten instances of %s in file %s\n", repstr, tp->name);
|
||||
/* Mark cell as placeholder so it will not be flattened */
|
||||
tp->flags |= CELL_PLACEHOLDER;
|
||||
tptop = GetTopCell(filenum);
|
||||
if (tp == NULL)
|
||||
Printf("Error: Cell %s does not exist.\n", repstr);
|
||||
else {
|
||||
Printf("Will not flatten instances of %s in file %s\n", repstr, tptop->name);
|
||||
/* Mark cell as placeholder so it will not be flattened */
|
||||
tp->flags |= CELL_PLACEHOLDER;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "class valid_cellname");
|
||||
|
||||
Reference in New Issue
Block a user