Finished implementing cell versioning, which was implemented for
file writes by adding the path for each cell use, but being ignored for file reads. The cell path saved in the .mag file is now honored on read-back. If the cell needs updating, then the cell version can be manipulated using "cellname filepath". No UI methods are currently implemented for managing cell versions.
This commit is contained in:
parent
2df755d857
commit
e60edf3c58
|
|
@ -1156,8 +1156,8 @@ dbReadUse(cellDef, line, len, f, scalen, scaled)
|
|||
int scaled; /* Divide values in file by this */
|
||||
{
|
||||
int xlo, xhi, ylo, yhi, xsep, ysep, childStamp;
|
||||
int absa, absb, absd, abse;
|
||||
char cellname[1024], useid[1024];
|
||||
int absa, absb, absd, abse, nconv;
|
||||
char cellname[1024], useid[1024], path[1024];
|
||||
CellUse *subCellUse;
|
||||
CellDef *subCellDef;
|
||||
Transform t;
|
||||
|
|
@ -1171,11 +1171,15 @@ dbReadUse(cellDef, line, len, f, scalen, scaled)
|
|||
}
|
||||
|
||||
useid[0] = '\0';
|
||||
if (sscanf(line, "use %1023s %1023s", cellname, useid) < 1)
|
||||
nconv = sscanf(line, "use %1023s %1023s %1023s", cellname, useid, path);
|
||||
if (nconv < 1)
|
||||
{
|
||||
TxError("Malformed \"use\" line: %s", line);
|
||||
return (FALSE);
|
||||
}
|
||||
/* Make sure useid[0] is an empty string if no useid was provided */
|
||||
if (nconv == 1) useid[0] = '\0';
|
||||
if (nconv == 2) path[0] = '\0';
|
||||
|
||||
locked = (useid[0] == CULOCKCHAR) ? TRUE : FALSE;
|
||||
|
||||
|
|
@ -1318,6 +1322,43 @@ badTransform:
|
|||
goto nextLine;
|
||||
}
|
||||
|
||||
if (path[0] != '\0')
|
||||
{
|
||||
/* If "use" line contains a path name, then set cd_file to this */
|
||||
/* and it will be the preferred path. If cd_file is already */
|
||||
/* set and points to a different target, then flag an error, as */
|
||||
/* there are now two versions of the same cell name coming from */
|
||||
/* different sources, and this must be corrected. */
|
||||
|
||||
if (subCellDef->cd_file != NULL)
|
||||
{
|
||||
char *slashptr = strrchr(subCellDef->cd_file, '/');
|
||||
if (slashptr != NULL)
|
||||
{
|
||||
*slashptr = '\0';
|
||||
|
||||
/* NOTE: This routine should probably check for */
|
||||
/* relative vs. absolute paths. . . */
|
||||
|
||||
if (strcmp(subCellDef->cd_file, path))
|
||||
{
|
||||
TxError("Internal inconsistency: Instance is from path %s"
|
||||
" but cell definition comes from %s.\n",
|
||||
path, subCellDef->cd_file);
|
||||
TxError("Instance path will be ignored. Please check and fix.\n");
|
||||
}
|
||||
*slashptr = '/';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Reconstruct file from path and cellname */
|
||||
strcat(path, "/");
|
||||
strcat(path, subCellDef->cd_name);
|
||||
strcat(path, DBSuffix);
|
||||
StrDup(&subCellDef->cd_file, path);
|
||||
}
|
||||
}
|
||||
|
||||
subCellUse = DBCellNewUse(subCellDef, (useid[0]) ?
|
||||
((locked) ? useid + 1 : useid) : (char *) NULL);
|
||||
|
|
|
|||
Loading…
Reference in New Issue