Corrected an error in ext2spice related to the recent modification to get
rid of redundant port entries in subcircuits. There is still an outstanding issue as to whether nodes and connections need to be recursively iterated to the hierarchy bottom. The current fix corrected the test case. Also, added a "-dereference" option to the "load" command to revert to the original behavior of using only search paths from "addpath" when searching for files to load.
This commit is contained in:
parent
5007f3f602
commit
0eb3b1fe1c
|
|
@ -227,7 +227,7 @@ done:
|
|||
if (mw != NULL)
|
||||
{
|
||||
if (calmaLookCell(libname, NULL) != (CellDef *)NULL)
|
||||
DBWloadWindow(mw, libname, FALSE);
|
||||
DBWloadWindow(mw, libname, FALSE, FALSE);
|
||||
}
|
||||
freeMagic(libname);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -746,7 +746,7 @@ calmaProcessDef(def, outf)
|
|||
|
||||
/* Read the cell in if it is not already available. */
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return (0);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -312,7 +312,7 @@ cifOut(outf)
|
|||
/* Read the cell in if it is not already available. */
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
{
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) continue;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) continue;
|
||||
}
|
||||
|
||||
/* Add any subcells to the stack. This must be done before
|
||||
|
|
|
|||
|
|
@ -3079,7 +3079,7 @@ CmdDown(w, cmd)
|
|||
GeoTransRect(&EditToRootTransform, &(EditCellUse->cu_def->cd_bbox), &area);
|
||||
(void) WindSearch(DBWclientID, (ClientData) NULL,
|
||||
(Rect *) NULL, cmdEditRedisplayFunc, (ClientData) &area);
|
||||
DBWloadWindow(w, EditCellUse->cu_def->cd_name, TRUE, FALSE);
|
||||
DBWloadWindow(w, EditCellUse->cu_def->cd_name, TRUE, FALSE, FALSE);
|
||||
}
|
||||
|
||||
/* Search function to find the new edit cell: look for a cell use
|
||||
|
|
@ -3777,7 +3777,7 @@ cmdDumpParseArgs(cmdName, w, cmd, dummy, scx)
|
|||
* looked for then no new error message will be printed.
|
||||
*/
|
||||
def->cd_flags &= ~CDNOTFOUND;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return (FALSE);
|
||||
DBReComputeBbox(def);
|
||||
dummy->cu_def = def;
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ CmdEdit(w, cmd)
|
|||
return;
|
||||
}
|
||||
else if (!(EditCellUse->cu_def->cd_flags & CDAVAILABLE))
|
||||
DBCellRead(EditCellUse->cu_def, (char *)NULL, TRUE, NULL);
|
||||
DBCellRead(EditCellUse->cu_def, (char *)NULL, TRUE, FALSE, NULL);
|
||||
|
||||
if (EditCellUse->cu_def->cd_flags & CDNOEDIT)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@ CmdLabel(w, cmd)
|
|||
* Implement the "load" command.
|
||||
*
|
||||
* Usage:
|
||||
* load [name [scaled n [d]]] [-force] [-nowindow]
|
||||
* load [name [scaled n [d]]] [-force] [-nowindow] [-dereference]
|
||||
*
|
||||
* If name is supplied, then the window containing the point tool is
|
||||
* remapped so as to edit the cell with the given name.
|
||||
|
|
@ -331,6 +331,13 @@ CmdLabel(w, cmd)
|
|||
* An input file can be scaled by specifying the "scaled" option, for
|
||||
* which the geometry of the input file is multiplied by n/d.
|
||||
*
|
||||
* Magic saves the path to instances to ensure correct versioning. But
|
||||
* this interferes with attempts to re-link instances from a different
|
||||
* location (such as an abstract view instead of a full view, or vice
|
||||
* versa). So the "-dereference" option strips the instance paths from
|
||||
* the input file and relies only on the search locations set up by the
|
||||
* "path" command to find the location of instances.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
|
|
@ -350,6 +357,7 @@ CmdLoad(w, cmd)
|
|||
int locargc = cmd->tx_argc;
|
||||
bool ignoreTech = FALSE;
|
||||
bool noWindow = FALSE;
|
||||
bool dereference = FALSE;
|
||||
int keepGoing(); /* forward declaration */
|
||||
|
||||
if (locargc > 2)
|
||||
|
|
@ -359,6 +367,11 @@ CmdLoad(w, cmd)
|
|||
locargc--;
|
||||
noWindow = TRUE;
|
||||
}
|
||||
if (!strncmp(cmd->tx_argv[locargc - 1], "-deref", 5))
|
||||
{
|
||||
locargc--;
|
||||
dereference = TRUE;
|
||||
}
|
||||
if (!strncmp(cmd->tx_argv[locargc - 1], "-force", 6))
|
||||
{
|
||||
locargc--;
|
||||
|
|
@ -372,7 +385,8 @@ CmdLoad(w, cmd)
|
|||
d = atoi(cmd->tx_argv[4]);
|
||||
else if (locargc != 4)
|
||||
{
|
||||
TxError("Usage: %s name scaled n [d] [-force] [-nowindow]\n",
|
||||
TxError("Usage: %s name scaled n [d] [-force] "
|
||||
"[-nowindow] [-dereference]\n",
|
||||
cmd->tx_argv[0]);
|
||||
return;
|
||||
}
|
||||
|
|
@ -380,9 +394,10 @@ CmdLoad(w, cmd)
|
|||
DBLambda[1] *= n;
|
||||
ReduceFraction(&DBLambda[0], &DBLambda[1]);
|
||||
}
|
||||
else if (!ignoreTech && !noWindow)
|
||||
else if (!ignoreTech && !noWindow && !dereference)
|
||||
{
|
||||
TxError("Usage: %s name [scaled n [d]] [-force] [-nowindow]\n",
|
||||
TxError("Usage: %s name [scaled n [d]] [-force] "
|
||||
"[-nowindow] [-dereference]\n",
|
||||
cmd->tx_argv[0]);
|
||||
return;
|
||||
}
|
||||
|
|
@ -408,7 +423,7 @@ CmdLoad(w, cmd)
|
|||
}
|
||||
#endif
|
||||
DBWloadWindow((noWindow == TRUE) ? NULL : w, cmd->tx_argv[1],
|
||||
ignoreTech, FALSE);
|
||||
ignoreTech, FALSE, dereference);
|
||||
|
||||
if ((n > 1) || (d > 1))
|
||||
{
|
||||
|
|
@ -441,7 +456,7 @@ CmdLoad(w, cmd)
|
|||
ReduceFraction(&DBLambda[0], &DBLambda[1]);
|
||||
}
|
||||
}
|
||||
else DBWloadWindow(w, (char *) NULL, TRUE, FALSE);
|
||||
else DBWloadWindow(w, (char *) NULL, TRUE, FALSE, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ cmdFlushCell(def)
|
|||
}
|
||||
DBCellClearDef(def);
|
||||
DBCellClearAvail(def);
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL);
|
||||
DBCellSetAvail(def);
|
||||
DBReComputeBbox(def);
|
||||
DBCellSetModified(def, FALSE);
|
||||
|
|
|
|||
|
|
@ -1885,9 +1885,9 @@ CmdXload(w, cmd)
|
|||
{
|
||||
if (CmdIllegalChars(cmd->tx_argv[1], "[],", "Cell name"))
|
||||
return;
|
||||
DBWloadWindow(w, cmd->tx_argv[1], FALSE, TRUE);
|
||||
DBWloadWindow(w, cmd->tx_argv[1], FALSE, TRUE, FALSE);
|
||||
}
|
||||
else DBWloadWindow(w, (char *) NULL, FALSE, TRUE);
|
||||
else DBWloadWindow(w, (char *) NULL, FALSE, TRUE, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ dbCellTileSrFunc(scx, fp)
|
|||
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask))
|
||||
return 0;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
context.tc_scx = scx;
|
||||
context.tc_filter = fp;
|
||||
|
|
@ -307,7 +307,7 @@ dbCellUniqueTileSrFunc(scx, fp)
|
|||
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask))
|
||||
return 0;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
context.tc_scx = scx;
|
||||
context.tc_filter = fp;
|
||||
|
|
@ -418,7 +418,7 @@ DBNoTreeSrTiles(scx, mask, xMask, func, cdarg)
|
|||
return 0;
|
||||
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
filter.tf_func = func;
|
||||
filter.tf_arg = cdarg;
|
||||
|
|
@ -526,7 +526,7 @@ DBTreeSrLabels(scx, mask, xMask, tpath, flags, func, cdarg)
|
|||
ASSERT(def != (CellDef *) NULL, "DBTreeSrLabels");
|
||||
if (!DBDescendSubcell(cellUse, xMask)) return 0;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
for (lab = def->cd_labels; lab; lab = lab->lab_next)
|
||||
{
|
||||
|
|
@ -627,7 +627,7 @@ dbCellLabelSrFunc(scx, fp)
|
|||
ASSERT(def != (CellDef *) NULL, "dbCellLabelSrFunc");
|
||||
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask)) return 0;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
if (fp->tf_tpath != (TerminalPath *) NULL)
|
||||
{
|
||||
|
|
@ -741,7 +741,7 @@ DBTreeSrCells(scx, xMask, func, cdarg)
|
|||
if (!DBDescendSubcell(cellUse, xMask))
|
||||
return 0;
|
||||
if ((cellUse->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(cellUse->cu_def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(cellUse->cu_def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return 0;
|
||||
|
||||
context.tc_scx = scx;
|
||||
|
|
@ -787,7 +787,7 @@ dbTreeCellSrFunc(scx, fp)
|
|||
else
|
||||
{
|
||||
if ((use->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(use->cu_def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(use->cu_def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return 0;
|
||||
result = DBCellSrArea(scx, dbTreeCellSrFunc, (ClientData) fp);
|
||||
}
|
||||
|
|
@ -1039,7 +1039,7 @@ DBCellSrArea(scx, func, cdarg)
|
|||
context.tc_scx = scx;
|
||||
|
||||
if ((scx->scx_use->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(scx->scx_use->cu_def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(scx->scx_use->cu_def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return 0;
|
||||
|
||||
/* In order to make this work with zero-size areas, we first expand
|
||||
|
|
@ -1215,7 +1215,7 @@ DBCellEnum(cellDef, func, cdarg)
|
|||
filter.tf_func = func;
|
||||
filter.tf_arg = cdarg;
|
||||
if ((cellDef->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(cellDef, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(cellDef, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
if (TiSrArea((Tile *) NULL, cellDef->cd_planes[PL_CELL],
|
||||
&TiPlaneRect, dbEnumFunc, (ClientData) &filter))
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ DBDescendSubcell(use, xMask)
|
|||
|
||||
case CU_DESCEND_NO_SUBCKT:
|
||||
if ((use->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(use->cu_def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(use->cu_def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return FALSE;
|
||||
return (DBIsSubcircuit(use->cu_def)) ? FALSE : TRUE;
|
||||
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ DBExpand(cellUse, expandMask, expandFlag)
|
|||
def = cellUse->cu_def;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
{
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return;
|
||||
/* Note: we don't have to recompute the bbox here, because
|
||||
* if it changed, then a timestamp violation must have occurred
|
||||
|
|
@ -144,7 +144,7 @@ DBExpandAll(rootUse, rootRect, expandMask, expandFlag, func, cdarg)
|
|||
struct expandArg arg;
|
||||
|
||||
if ((rootUse->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
(void) DBCellRead(rootUse->cu_def, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(rootUse->cu_def, (char *) NULL, TRUE, FALSE, NULL);
|
||||
|
||||
/*
|
||||
* Walk through the area and set the expansion state
|
||||
|
|
@ -193,7 +193,7 @@ dbExpandFunc(scx, arg)
|
|||
/* If the cell is unavailable, then don't expand it.
|
||||
*/
|
||||
if ((childUse->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
if(!DBCellRead(childUse->cu_def, (char *) NULL, TRUE, NULL))
|
||||
if(!DBCellRead(childUse->cu_def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
{
|
||||
TxError("Cell %s is unavailable. It could not be expanded.\n",
|
||||
childUse->cu_def->cd_name);
|
||||
|
|
@ -303,7 +303,7 @@ dbReadAreaFunc(scx)
|
|||
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
{
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL);
|
||||
/* Note: we don't have to invoke DBReComputeBbox here because
|
||||
* if the bbox changed then there was a timestamp mismatch and
|
||||
* the timestamp code will take care of the bounding box later.
|
||||
|
|
|
|||
|
|
@ -264,7 +264,7 @@ file_is_not_writeable(name)
|
|||
*/
|
||||
|
||||
bool
|
||||
dbCellReadDef(f, cellDef, name, ignoreTech)
|
||||
dbCellReadDef(f, cellDef, name, ignoreTech, dereference)
|
||||
FILE *f; /* The file, already opened by the caller */
|
||||
CellDef *cellDef; /* Pointer to definition of cell to be read in */
|
||||
char *name; /* Name of file from which to read definition.
|
||||
|
|
@ -279,6 +279,7 @@ dbCellReadDef(f, cellDef, name, ignoreTech)
|
|||
* names do not match, but an attempt will be
|
||||
* made to read the file anyway.
|
||||
*/
|
||||
bool dereference; /* If TRUE, ignore path references in the input */
|
||||
{
|
||||
int cellStamp = 0, rectCount = 0, rectReport = 10000;
|
||||
char line[2048], tech[50], layername[50];
|
||||
|
|
@ -437,7 +438,7 @@ dbCellReadDef(f, cellDef, name, ignoreTech)
|
|||
*/
|
||||
if (sscanf(line, "<< %s >>", layername) != 1)
|
||||
{
|
||||
if (!dbReadUse(cellDef, line, sizeof line, f, n, d))
|
||||
if (!dbReadUse(cellDef, line, sizeof line, f, n, d, dereference))
|
||||
goto badfile;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -863,7 +864,7 @@ DBReadBackup(name)
|
|||
cellDef->cd_flags &= ~CDNOTFOUND;
|
||||
cellDef->cd_flags |= CDAVAILABLE;
|
||||
|
||||
if (dbCellReadDef(f, cellDef, filename, TRUE) == FALSE)
|
||||
if (dbCellReadDef(f, cellDef, filename, TRUE, FALSE) == FALSE)
|
||||
return FALSE;
|
||||
|
||||
if (dbFgets(line, sizeof(line), f) == NULL)
|
||||
|
|
@ -919,7 +920,7 @@ DBReadBackup(name)
|
|||
*/
|
||||
|
||||
bool
|
||||
DBCellRead(cellDef, name, ignoreTech, errptr)
|
||||
DBCellRead(cellDef, name, ignoreTech, dereference, errptr)
|
||||
CellDef *cellDef; /* Pointer to definition of cell to be read in */
|
||||
char *name; /* Name of file from which to read definition.
|
||||
* If NULL, then use cellDef->cd_file; if that
|
||||
|
|
@ -933,6 +934,7 @@ DBCellRead(cellDef, name, ignoreTech, errptr)
|
|||
* names do not match, but an attempt will be
|
||||
* made to read the file anyway.
|
||||
*/
|
||||
bool dereference; /* If TRUE, ignore path references in the input */
|
||||
int *errptr; /* Copy of errno set by file reading routine
|
||||
* is placed here, unless NULL.
|
||||
*/
|
||||
|
|
@ -950,7 +952,7 @@ DBCellRead(cellDef, name, ignoreTech, errptr)
|
|||
|
||||
else
|
||||
{
|
||||
result = (dbCellReadDef(f, cellDef, name, ignoreTech));
|
||||
result = (dbCellReadDef(f, cellDef, name, ignoreTech, dereference));
|
||||
|
||||
#ifdef FILE_LOCKS
|
||||
/* Close files that were locked by another user */
|
||||
|
|
@ -1193,13 +1195,14 @@ DBTestOpen(name, fullPath)
|
|||
*/
|
||||
|
||||
bool
|
||||
dbReadUse(cellDef, line, len, f, scalen, scaled)
|
||||
dbReadUse(cellDef, line, len, f, scalen, scaled, dereference)
|
||||
CellDef *cellDef; /* Cell whose cells are being read */
|
||||
char *line; /* Line containing "use ..." */
|
||||
int len; /* Size of buffer pointed to by line */
|
||||
FILE *f; /* Input file */
|
||||
int scalen; /* Multiply values in file by this */
|
||||
int scaled; /* Divide values in file by this */
|
||||
bool dereference; /* If TRUE, ignore path references */
|
||||
{
|
||||
int xlo, xhi, ylo, yhi, xsep, ysep, childStamp;
|
||||
int absa, absb, absd, abse, nconv;
|
||||
|
|
@ -1230,7 +1233,7 @@ dbReadUse(cellDef, line, len, f, scalen, scaled)
|
|||
|
||||
pathptr = &path[0];
|
||||
while (*pathptr == ' ' || *pathptr == '\t') pathptr++;
|
||||
if (*pathptr == '\n') *pathptr = '\0';
|
||||
if ((dereference == TRUE) || (*pathptr == '\n')) *pathptr = '\0';
|
||||
|
||||
locked = (useid[0] == CULOCKCHAR) ? TRUE : FALSE;
|
||||
|
||||
|
|
@ -2840,7 +2843,7 @@ DBCellWrite(cellDef, fileName)
|
|||
#ifdef FILE_LOCKS
|
||||
else
|
||||
/* Re-aquire the lock on the new file by opening it. */
|
||||
DBCellRead(cellDef, NULL, TRUE, NULL);
|
||||
DBCellRead(cellDef, NULL, TRUE, FALSE, NULL);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ DBTreeFindUse(name, use, scx)
|
|||
* is read in from disk.
|
||||
*/
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL);
|
||||
|
||||
cp = name;
|
||||
he = HashLookOnly(&def->cd_idHash, name);
|
||||
|
|
@ -343,7 +343,7 @@ DBTreeFindUse(name, use, scx)
|
|||
/* Ensure that the leaf cell is read in */
|
||||
def = use->cu_def;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL);
|
||||
|
||||
scx->scx_use = use;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ DBFixMismatch()
|
|||
mismatch = mismatch->mm_next;
|
||||
if (cellDef->cd_flags & CDPROCESSED) continue;
|
||||
|
||||
(void) DBCellRead(cellDef, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(cellDef, (char *) NULL, TRUE, FALSE, NULL);
|
||||
|
||||
/* Jimmy up the cell's current bounding box, so the following
|
||||
* procedure call will absolutely and positively know that
|
||||
|
|
|
|||
|
|
@ -127,10 +127,10 @@ DBWcreate(window, argc, argv)
|
|||
|
||||
window->w_clientData = (ClientData) crec;
|
||||
if (argc > 0)
|
||||
DBWloadWindow(window, argv[0], TRUE, FALSE);
|
||||
DBWloadWindow(window, argv[0], TRUE, FALSE, FALSE);
|
||||
else if (ToolGetBox(&boxDef, &box))
|
||||
{
|
||||
DBWloadWindow(window, boxDef->cd_name, TRUE, FALSE);
|
||||
DBWloadWindow(window, boxDef->cd_name, TRUE, FALSE, FALSE);
|
||||
|
||||
/* Zoom in on the box, leaving a 10% border or at least 2 units
|
||||
* on each side.
|
||||
|
|
@ -148,7 +148,7 @@ DBWcreate(window, argc, argv)
|
|||
}
|
||||
else
|
||||
{
|
||||
DBWloadWindow(window, (char *) NULL, TRUE, FALSE);
|
||||
DBWloadWindow(window, (char *) NULL, TRUE, FALSE, FALSE);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -249,7 +249,7 @@ dbwReloadFunc(w, name)
|
|||
MagWindow *w;
|
||||
char *name;
|
||||
{
|
||||
DBWloadWindow(w, name, TRUE, FALSE);
|
||||
DBWloadWindow(w, name, TRUE, FALSE, FALSE);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -274,18 +274,20 @@ dbwReloadFunc(w, name)
|
|||
* cell doesn't change.
|
||||
*
|
||||
* If "expand" is true, unexpands all subcells of the root cell.
|
||||
* If "dereference" is true, ignore path reference in the input file.
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
DBWloadWindow(window, name, ignoreTech, expand)
|
||||
DBWloadWindow(window, name, ignoreTech, expand, dereference)
|
||||
MagWindow *window; /* Identifies window to which cell is to be bound */
|
||||
char *name; /* Name of new cell to be bound to this window */
|
||||
bool ignoreTech; /* If FALSE, indicates that the technology of
|
||||
* the layout must match the current technology.
|
||||
*/
|
||||
bool expand; /* Indicates whether or not to expand the cell */
|
||||
bool dereference; /* If TRUE, ignore path references in the input */
|
||||
{
|
||||
CellDef *newEditDef;
|
||||
CellUse *newEditUse;
|
||||
|
|
@ -383,7 +385,7 @@ DBWloadWindow(window, name, ignoreTech, expand)
|
|||
if (newEditDef == (CellDef *) NULL)
|
||||
newEditDef = DBCellNewDef(rootname, (char *) NULL);
|
||||
|
||||
if (!DBCellRead(newEditDef, name, ignoreTech, &error_val))
|
||||
if (!DBCellRead(newEditDef, name, ignoreTech, dereference, &error_val))
|
||||
{
|
||||
if (error_val == ENOENT)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -969,7 +969,7 @@ drcFindFunc(scx, finddata)
|
|||
if (HashGetValue(h) != 0) return 0;
|
||||
HashSetValue(h, 1);
|
||||
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, NULL);
|
||||
(void) DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL);
|
||||
|
||||
if (DBSrPaintArea((Tile *) NULL, def->cd_planes[PL_DRC_ERROR],
|
||||
&def->cd_bbox, &DBAllButSpaceBits, drcFindFunc2,
|
||||
|
|
|
|||
|
|
@ -59,7 +59,8 @@ bool efFlatGlobCmp(HierName *, HierName *);
|
|||
char *efFlatGlobCopy(HierName *);
|
||||
void efFlatGlobError(EFNodeName *, EFNodeName *);
|
||||
int efAddNodes(HierContext *, bool);
|
||||
int efAddOneConn(HierContext *, char *, char *, Connection *);
|
||||
int efAddConns(HierContext *, bool);
|
||||
int efAddOneConn(HierContext *, char *, char *, Connection *, bool);
|
||||
|
||||
|
||||
/*
|
||||
|
|
@ -193,8 +194,11 @@ EFFlatBuildOneLevel(def, flags)
|
|||
efFlatContext.hc_x = efFlatContext.hc_y = 0;
|
||||
efFlatRootUse.use_def = efFlatRootDef;
|
||||
|
||||
/* NOTE: Do the following two routines need to be deeper than one level? */
|
||||
/* Record all nodes of the next level in the hierarchy */
|
||||
efHierSrUses(&efFlatContext, efAddNodes, (ClientData)TRUE);
|
||||
/* Record those connections as well. */
|
||||
efHierSrUses(&efFlatContext, efAddConns, (ClientData)FALSE);
|
||||
|
||||
/* Expand all subcells that contain connectivity information but */
|
||||
/* no active devices (including those in subcells). */
|
||||
|
|
@ -210,7 +214,7 @@ EFFlatBuildOneLevel(def, flags)
|
|||
|
||||
/* Record all local nodes */
|
||||
efAddNodes(&efFlatContext, FALSE);
|
||||
efAddConns(&efFlatContext);
|
||||
efAddConns(&efFlatContext, TRUE);
|
||||
|
||||
efFlatKills(&efFlatContext);
|
||||
if (!(flags & EF_NONAMEMERGE))
|
||||
|
|
@ -300,7 +304,7 @@ efFlatNodes(hc)
|
|||
efAddNodes(hc, FALSE);
|
||||
|
||||
/* Process our own connections and adjustments */
|
||||
(void) efAddConns(hc);
|
||||
(void) efAddConns(hc, TRUE);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -352,7 +356,7 @@ efFlatNodesStdCell(hc)
|
|||
|
||||
/* Process our own connections and adjustments */
|
||||
if (!(hc->hc_use->use_def->def_flags & DEF_SUBCIRCUIT))
|
||||
(void) efAddConns(hc);
|
||||
(void) efAddConns(hc, TRUE);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -378,7 +382,7 @@ efFlatNodesDeviceless(hc, cdata)
|
|||
efAddNodes(hc, TRUE);
|
||||
|
||||
/* Process our own connections and adjustments */
|
||||
efAddConns(hc);
|
||||
efAddConns(hc, TRUE);
|
||||
|
||||
/* Mark this definition as having no devices, so it will not be visited */
|
||||
hc->hc_use->use_def->def_flags |= DEF_NODEVICES;
|
||||
|
|
@ -562,8 +566,9 @@ efAddNodes(hc, stdcell)
|
|||
*/
|
||||
|
||||
int
|
||||
efAddConns(hc)
|
||||
efAddConns(hc, doWarn)
|
||||
HierContext *hc;
|
||||
bool doWarn;
|
||||
{
|
||||
Connection *conn;
|
||||
|
||||
|
|
@ -576,9 +581,9 @@ efAddConns(hc)
|
|||
{
|
||||
/* Special case for speed when no array info is present */
|
||||
if (conn->conn_1.cn_nsubs == 0)
|
||||
efAddOneConn(hc, conn->conn_name1, conn->conn_name2, conn);
|
||||
efAddOneConn(hc, conn->conn_name1, conn->conn_name2, conn, doWarn);
|
||||
else
|
||||
efHierSrArray(hc, conn, efAddOneConn, (ClientData) NULL);
|
||||
efHierSrArray(hc, conn, efAddOneConn, (ClientData)doWarn);
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
|
@ -605,16 +610,17 @@ efAddConns(hc)
|
|||
*/
|
||||
|
||||
int
|
||||
efAddOneConn(hc, name1, name2, conn)
|
||||
efAddOneConn(hc, name1, name2, conn, doWarn)
|
||||
HierContext *hc;
|
||||
char *name1, *name2; /* These are strings, not HierNames */
|
||||
Connection *conn;
|
||||
bool doWarn;
|
||||
{
|
||||
HashEntry *he1, *he2;
|
||||
EFNode *node, *newnode;
|
||||
int n;
|
||||
|
||||
he1 = EFHNLook(hc->hc_hierName, name1, "connect(1)");
|
||||
he1 = EFHNLook(hc->hc_hierName, name1, (doWarn) ? "connect(1)" : NULL);
|
||||
if (he1 == NULL)
|
||||
return 0;
|
||||
|
||||
|
|
@ -630,7 +636,7 @@ efAddOneConn(hc, name1, name2, conn)
|
|||
/* Merge this node with conn_name2 if one was specified */
|
||||
if (name2)
|
||||
{
|
||||
he2 = EFHNLook(hc->hc_hierName, name2, "connect(2)");
|
||||
he2 = EFHNLook(hc->hc_hierName, name2, (doWarn) ? "connect(2)" : NULL);
|
||||
if (he2 == NULL)
|
||||
return 0;
|
||||
newnode = ((EFNodeName *) HashGetValue(he2))->efnn_node;
|
||||
|
|
|
|||
|
|
@ -424,7 +424,7 @@ extTreeSrPaintArea(scx, func, cdarg)
|
|||
int pNum;
|
||||
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
filter.tf_func = func;
|
||||
filter.tf_arg = cdarg;
|
||||
|
|
@ -461,7 +461,7 @@ extTreeSrFunc(scx, fp)
|
|||
int pNum;
|
||||
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return (0);
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return (0);
|
||||
|
||||
context.tc_scx = scx;
|
||||
context.tc_filter = fp;
|
||||
|
|
@ -548,7 +548,7 @@ extCellSrArea(scx, func, cdarg)
|
|||
filter.tf_arg = cdarg;
|
||||
|
||||
if ((scx->scx_use->cu_def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(scx->scx_use->cu_def, (char *) NULL, TRUE, NULL))
|
||||
if (!DBCellRead(scx->scx_use->cu_def, (char *) NULL, TRUE, FALSE, NULL))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1394,7 +1394,7 @@ W3DloadWindow(window, name)
|
|||
if (newEditDef == (CellDef *)NULL)
|
||||
return FALSE;
|
||||
|
||||
if (!DBCellRead(newEditDef, (char *)NULL, TRUE, NULL))
|
||||
if (!DBCellRead(newEditDef, (char *)NULL, TRUE, FALSE, NULL))
|
||||
return FALSE;
|
||||
|
||||
DBReComputeBbox(newEditDef);
|
||||
|
|
|
|||
|
|
@ -1491,7 +1491,7 @@ DefReadComponents(f, rootDef, sname, oscale, total)
|
|||
/* magic .mag layout file. */
|
||||
defMacro = DBCellNewDef(token, (char *)NULL);
|
||||
defMacro->cd_flags &= ~CDNOTFOUND;
|
||||
if (!DBCellRead(defMacro, (char *)NULL, TRUE, NULL))
|
||||
if (!DBCellRead(defMacro, (char *)NULL, TRUE, FALSE, NULL))
|
||||
{
|
||||
LefError(DEF_ERROR, "Cell %s is not defined. Maybe you "
|
||||
"have not read the corresponding LEF file?\n",
|
||||
|
|
|
|||
|
|
@ -789,7 +789,7 @@ SimCellTileSrFunc(scx, fp)
|
|||
if (!DBDescendSubcell(scx->scx_use, fp->tf_xmask))
|
||||
return 0;
|
||||
if ((def->cd_flags & CDAVAILABLE) == 0)
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, NULL)) return 0;
|
||||
if (!DBCellRead(def, (char *) NULL, TRUE, FALSE, NULL)) return 0;
|
||||
|
||||
context.tc_scx = scx;
|
||||
context.tc_filter = fp;
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ WindUnload(surfaceID)
|
|||
|
||||
for (mw = windTopWindow; mw != NULL; mw = mw->w_nextWindow)
|
||||
if (mw->w_surfaceID == surfaceID)
|
||||
DBWloadWindow(mw, (char *)NULL, TRUE, FALSE);
|
||||
DBWloadWindow(mw, (char *)NULL, TRUE, FALSE, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue