Open d-m-bailey opened 1 year ago
The "implicit" references, as you call them, cannot be the issue. When reading a .mag file, magic reads a cell only once, the first time that cell is encountered. For the rest of that file, the cell has already been read in, which is why the reference is not repeated---it would be redundant to provide the same reference each time, and it would be an error to provide the same cell with two different references in the same file (it would be an impossibility unless the file was hand-edited).
But I do agree that there is some issue where the cell has been read in from a file but somehow has a cd_file
entry that is not a location of anything, and seems to be some scrambled concoction of $PDKPATH and other path components. It looks like that might be caused by the lines in database/DBio.c
that have the comment "Reconstruct file from path and cellname"---that is the only place where the cd_file
record does not reflect the actual file that was read. But it would have to be an earlier conflict that caused the original name change. Are there earlier error or warning messages?
So there may be a couple issues. The mag cells in the user project area contain incorrect relative paths.
use sky130_fd_sc_hd__diode_2 ANTENNA_1 dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag
timestamp 1676037725
transform 1 0 175904 0 1 11968
box -38 -48 222 592
Relative paths should be calculated with respect to the top mag file directory and not merely the matching portion. $PDKPATH
references should probably be kept as is.
However, when reading this entry, it appears that an error is only generated if the cell already existed.
If this is a newly read cell, no error is flagged even though this is an invalid path. The data may have been found on one of the search paths, but the data read is still being recorded as if it was at the bad path.
This yields the previously mentioned error:
Duplicate cell in housekeeping: Instance of cell sky130_fd_sc_hd__nand2_1.mag is from path /home/user/mpw-9/dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag but cell was previously read from /home/user/mpw-9/caravel_user_project3/mag/dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag.
Cell name conflict: Renaming original cell to sky130_fd_sc_hd__nand2_1#0.
The previously read cell does not exist at that location.
On the other hand, if the cell is read from the PDK first, we get a message that the new path does not exist.
Duplicate cell in user_proj_example: Instance of cell sky130_fd_sc_hd__diode_2.mag is from path /home/kanobailey/mpw-9/caravel_user_project3/mag/dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag but cell was previously read from /home/kanobailey/mpw-9/dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag.
New path does not exist and will be ignored.
So we need to check:
bad file path
errors for missing absolute path references, but not for relative paths)Okay, I figured out how to duplicate the issue with a simple local setup:
(1) Copy a library cell (e.g., sky130_fd_sc_hd__and2_1
) to the current working directory
(2) Create a test layout containing the library cell and save it.
(3) Change the path of the library cell use in the test layout to invalid/path
.
(4) From a fresh start of magic, load the test layout (with the erroneous path). This will load without issue because the subcell has not been expanded.
(5) Load the local version of the subcell.
(6) cellname filepath
now shows the invalid path.
So: Step (5) should have detected that the cell existed and had a path that was not the path specified on the load
command. If that cell had never actually been loaded (which can be determined from a flag setting), then it should load it from the new location, but what it should do that it's not doing is to replace the file path when it does.
Excellent!
Eh. . . Would be if I could repeat the steps and get the same result, which I can't.
@RTimothyEdwards Tested with 8.3.384 and still get a mag file with incorrect references.
use sky130_fd_sc_hd__diode_2 ANTENNA_1 dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag
timestamp 1676037725
transform 1 0 175904 0 1 11968
box -38 -48 222 592
The execution directory is somewhere under /home/user/mpw-9/caravel_user_project3
and the PDK_ROOT
is /home/user/mpw-9/dependencies/pdks
.
When writing the mag file, the current relative reference calculation appears to remove the matching hierarchies from the reference path, which is incorrect. If the hierarchy of the parent cell is totally contained in the subcell reference, then the parent hierarchy could be removed from the subcell reference, but partial matching doesn't make sense and prevents portability.
Maybe the PDKPATH
should be checked before the relative path calculation, too.
I will check what's in the code; according to what I recall was the intended behavior, the code should have noticed that both parent and child exist under the $HOME
directory at /home/user/mpw-9
, but also should have counted the number of directories to get back up to the common point, so at worst it should have ended up with a valid path to something like ../dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag
. I agree, though, that checking $PDKPATH
first (before checking the home path) makes the most sense.
During caravel
make ship
, cells are read from multiple locations.The mag files contain an explicit reference for the first cell loaded, but implicit references for subsequent cells.
It appears that these implicit references are not recorded properly and cause a false mismatch when subsequent cells are read which results in a cell rename.
The previously read location does not exist - I think, it has been recorded incorrectly.
/home/user/mpw-9/dependencies/pdks/sky130A/libs.ref/sky130_fd_sc_hd/mag
is the correct PDK location. The recorded previous location/home/user/mpw-9/caravel_user_project3/mag
is the location of the block that was opened and has no sub-directorydependencies
.This error only occurs if there are implicit instances in the mag file. If there is only one instance of a cell in the previously loaded block, there do not appear to be any errors.
Running
make ship
with thecaravel/Makefile
substitutions at the top, should recreate the problem. (There are other problems with theMakefile
though).