diff --git a/commands/CmdCD.c b/commands/CmdCD.c index c21974ac..dc75256a 100644 --- a/commands/CmdCD.c +++ b/commands/CmdCD.c @@ -689,6 +689,7 @@ CmdCellname(w, cmd) "window list top-level cell of a layout window", "create create a new cell definition", "delete delete the named cell definition", + "dereference reload the named cell from the search paths", "filepath list the full path of the file for the cell", "flags list option flags of the indicated cell definition", "lock lock the named cell (prevent changes to cell use)", @@ -703,10 +704,10 @@ CmdCellname(w, cmd) }; typedef enum { IDX_CHILDREN, IDX_PARENTS, IDX_EXISTS, IDX_SELF, IDX_INSTANCE, IDX_CHILDINST, IDX_CELLDEF, IDX_ALLCELLS, - IDX_TOPCELLS, IDX_IN_WINDOW, IDX_CREATE, - IDX_DELETE, IDX_FILEPATH, IDX_FLAGS, IDX_LOCK, IDX_UNLOCK, - IDX_PROPERTY, IDX_ABUTMENT, IDX_ORIENTATION, IDX_RENAME, - IDX_READWRITE, IDX_MODIFIED } optionType; + IDX_TOPCELLS, IDX_IN_WINDOW, IDX_CREATE, IDX_DELETE, + IDX_DEREFERENCE, IDX_FILEPATH, IDX_FLAGS, IDX_LOCK, + IDX_UNLOCK, IDX_PROPERTY, IDX_ABUTMENT, IDX_ORIENTATION, + IDX_RENAME, IDX_READWRITE, IDX_MODIFIED } optionType; if (strstr(cmd->tx_argv[0], "in")) is_cellname = FALSE; @@ -743,8 +744,9 @@ CmdCellname(w, cmd) if (option < 0) goto badusage; if ((locargc > 3) && (option != IDX_RENAME) && (option != IDX_DELETE) && - (option != IDX_READWRITE) && (option != IDX_PROPERTY) && - (option != IDX_FILEPATH) && (option != IDX_ORIENTATION)) + (option != IDX_DEREFERENCE) && (option != IDX_READWRITE) && + (option != IDX_PROPERTY) && (option != IDX_FILEPATH) && + (option != IDX_ORIENTATION)) goto badusage; if ((locargc > 4) && (option != IDX_PROPERTY)) @@ -790,6 +792,7 @@ CmdCellname(w, cmd) return; case IDX_IN_WINDOW: case IDX_READWRITE: case IDX_FLAGS: case IDX_PROPERTY: case IDX_FILEPATH: case IDX_MODIFIED: + case IDX_DEREFERENCE: TxError("Function unimplemented for instances.\n"); return; case IDX_DELETE: @@ -867,6 +870,33 @@ CmdCellname(w, cmd) TxError("Delete cell command missing cellname\n"); break; + case IDX_DEREFERENCE: + /* Unload the cell definition and re-read with search paths */ + if (locargc == 3) + { + void cmdFlushCell(); + + if (cellname == NULL) + cellDef = EditRootDef; + else + cellDef = DBCellLookDef(cellname); + + /* Force dereferencing */ + cellDef->cd_flags |= CDDEREFERENCE; + freeMagic(cellDef->cd_file); + cellDef->cd_file = NULL; + + /* Reload cell */ + cmdFlushCell(cellDef); + + /* Clear dereferencing */ + cellDef->cd_flags &= ~CDDEREFERENCE; + SelectClear(); + } + else + TxError("Dereference cell command missing cellname\n"); + break; + case IDX_READWRITE: if (cellname == NULL) cellDef = EditRootDef; diff --git a/drc/DRCcontin.c b/drc/DRCcontin.c index 5d9a527f..f1e18d95 100644 --- a/drc/DRCcontin.c +++ b/drc/DRCcontin.c @@ -197,12 +197,7 @@ DRCCheckThis (celldef, operation, area) * of CellDefs waiting for DRC */ - /* Ignore internal GDS cells. */ - /* Note that this rescinds the former behavior of ignoring DRC on */ - /* vendor and read-only cells. Such cells will be flattened in */ - /* interaction areas and show errors anyway, so not showing errors */ - /* in the cell is just confusing. */ - + /* Ignore internal cells. */ if (celldef->cd_flags & CDINTERNAL) return; /* Insert celldef into list of Defs waiting to be checked, unless */