OpenLane icon indicating copy to clipboard operation
OpenLane copied to clipboard

LVS fails for fails for gf180mcuC

Open proppy opened this issue 3 years ago • 3 comments

Description

Trying to run:

export PDK_ROOT=/usr/local/share/pdk
export PDK=gf180mcuC
export STD_CELL_LIBRARY=gf180mcu_fd_sc_mcu7t5v0
export STD_CELL_LIBRARY_OPT=gf180mcu_fd_sc_mcu7t5v0

flow.tcl -ignore_mismatches -design spm

with https://github.com/proppy/volare-gf180mcu-wip/releases/download/gf180mcu-82d61e2_a897aa3_3d1aed6/default.tar.xz and https://github.com/The-OpenROAD-Project/OpenLane/commit/3ee8cf0da0b5292557e3f3ae398194d65970a6d2 reverted to workaround #1379 fails with the following error in the LVS step:

[ERROR]: There are LVS errors in the design: See 'OpenLane/designs/spm/runs/RUN_2022.09.21_01.23.13/logs/signoff/35-spm.lvs.lef.log' for details.

Expected behavior

Flow proceed to gds streaming.

Environment

Kernel: Linux v5.10.133+
Distribution: ubuntu 18.04
Python: v3.7.13 (OK)
Critical Alert: No Docker or Docker-compatible container engine was found.
OpenLane Git Version: d375db931edfb03fc42859d590eb3ec799bc6c9e
pip: INSTALLED
python-venv: INSTALLED
---
PDK Version Verification Status: OK
---
Git Log (Last 3 Commits)

d375db9 2022-09-15T13:35:19+02:00 [BOT] Update magic (#1318) - Openlane Bot -  (HEAD, tag: 2022.09.16)
37faafe 2022-09-12T14:58:32+02:00 Startup Fixes (#1344) - Mohamed Gaber -  (tag: 2022.09.13)
cbb9e6b 2022-09-12T14:49:15+02:00 Documentation Restructure (#1337) - Mohamed Gaber -  ()
---
Git Remotes

origin	https://github.com/The-OpenROAD-Project/OpenLane (fetch)
origin	https://github.com/The-OpenROAD-Project/OpenLane (push)

Reproduction Material

https://colab.research.google.com/gist/proppy/2c2576e8df29631ed98ac1eac760a458/gf180mcu-openlane-playground.ipynb#scrollTo=5hzngAqWcNlW

gf180mcu-spm-runs-lvs-issue.zip

Logs

LVS reports:
    net count difference = 0
    device count difference = 0
    unmatched nets = 0
    unmatched devices = 0
    unmatched pins = 392
    property failures = 0

Total errors = 392

proppy avatar Sep 21 '22 01:09 proppy

/cc @mithro

proppy avatar Sep 21 '22 02:09 proppy

@RTimothyEdwards do you think this could be related to recent netgen changes? I don't get any LVS errors when using an older version of netgen 1.5.229_0_g153ce0e: https://colab.sandbox.google.com/gist/proppy/5322c64a317a584aee81fb77f930152f/gf180mcu-openlane-playground.ipynb

[STEP 29]
[INFO]: Running LVS (log: OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/logs/signoff/29-lvs.lef.log)...

/content/OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/logs/signoff/29-lvs.lef.log:

Netgen 1.5.229 compiled on Wed Sep 14 16:04:31 UTC 2022
Warning: netgen command 'format' use fully-qualified name '::netgen::format'
Warning: netgen command 'global' use fully-qualified name '::netgen::global'
Generating JSON file result
Reading netlist file /content/OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/results/signoff/spm.spice
Reading netlist file /content/OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/tmp/signoff/26-spm.pnl.v
Warning:  A case-insensitive file has been read and so the	verilog file must be treated case-insensitive to match.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__clkbuf_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__nand2_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__nor2_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__oai21_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__xnor3_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__clkinv_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__xor2_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__dffrnq_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__endcap.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__filltie.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__clkbuf_4.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__clkbuf_16.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__antenna.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fillcap_32.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fill_1.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fillcap_8.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fill_2.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fillcap_4.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fillcap_64.
Creating placeholder cell definition for module gf180mcu_fd_sc_mcu7t5v0__fillcap_16.
Reading setup file /content/pdks/gf180mcuC/libs.tech/netgen/gf180mcuC_setup.tcl
Comparison output logged to file /content/OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/logs/signoff/29-spm.lef.log
Logging to file "/content/OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/logs/signoff/29-spm.lef.log" enabled
Circuit gf180mcu_fd_sc_mcu7t5v0__filltie contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__antenna contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fill_2 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__nor2_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__clkinv_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__nand2_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fill_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fillcap_8 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fillcap_4 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__oai21_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__xnor3_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__clkbuf_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__dffrnq_1 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fillcap_16 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__clkbuf_16 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fillcap_32 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__fillcap_64 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__clkbuf_4 contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__endcap contains no devices.
Circuit gf180mcu_fd_sc_mcu7t5v0__xor2_1 contains no devices.

Contents of circuit 1:  Circuit: 'spm'
Circuit spm contains 2512 device instances.
  Class: gf180mcu_fd_sc_mcu7t5v0__dffrnq_1 instances:  64
  Class: gf180mcu_fd_sc_mcu7t5v0__nand2_1 instances:  64
  Class: gf180mcu_fd_sc_mcu7t5v0__clkbuf_1 instances:  96
  Class: gf180mcu_fd_sc_mcu7t5v0__clkbuf_4 instances:   1
  Class: gf180mcu_fd_sc_mcu7t5v0__clkinv_1 instances:  65
  Class: gf180mcu_fd_sc_mcu7t5v0__filltie instances: 143
  Class: gf180mcu_fd_sc_mcu7t5v0__clkbuf_16 instances:   9
  Class: gf180mcu_fd_sc_mcu7t5v0__xnor3_1 instances:  31
  Class: gf180mcu_fd_sc_mcu7t5v0__oai21_1 instances:  31
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_4 instances: 190
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_8 instances:  77
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_64 instances:   1
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_16 instances:  37
  Class: gf180mcu_fd_sc_mcu7t5v0__fill_1 instances: 350
  Class: gf180mcu_fd_sc_mcu7t5v0__fill_2 instances: 723
  Class: gf180mcu_fd_sc_mcu7t5v0__nor2_1 instances:  31
  Class: gf180mcu_fd_sc_mcu7t5v0__antenna instances: 507
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_32 instances:  13
  Class: gf180mcu_fd_sc_mcu7t5v0__xor2_1 instances:   1
  Class: gf180mcu_fd_sc_mcu7t5v0__endcap instances:  78
Circuit contains 430 nets.
Contents of circuit 2:  Circuit: 'spm'
Circuit spm contains 2512 device instances.
  Class: gf180mcu_fd_sc_mcu7t5v0__dffrnq_1 instances:  64
  Class: gf180mcu_fd_sc_mcu7t5v0__nand2_1 instances:  64
  Class: gf180mcu_fd_sc_mcu7t5v0__clkbuf_1 instances:  96
  Class: gf180mcu_fd_sc_mcu7t5v0__clkbuf_4 instances:   1
  Class: gf180mcu_fd_sc_mcu7t5v0__clkinv_1 instances:  65
  Class: gf180mcu_fd_sc_mcu7t5v0__filltie instances: 143
  Class: gf180mcu_fd_sc_mcu7t5v0__clkbuf_16 instances:   9
  Class: gf180mcu_fd_sc_mcu7t5v0__xnor3_1 instances:  31
  Class: gf180mcu_fd_sc_mcu7t5v0__oai21_1 instances:  31
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_4 instances: 190
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_8 instances:  77
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_64 instances:   1
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_16 instances:  37
  Class: gf180mcu_fd_sc_mcu7t5v0__fill_1 instances: 350
  Class: gf180mcu_fd_sc_mcu7t5v0__fill_2 instances: 723
  Class: gf180mcu_fd_sc_mcu7t5v0__nor2_1 instances:  31
  Class: gf180mcu_fd_sc_mcu7t5v0__antenna instances: 507
  Class: gf180mcu_fd_sc_mcu7t5v0__fillcap_32 instances:  13
  Class: gf180mcu_fd_sc_mcu7t5v0__xor2_1 instances:   1
  Class: gf180mcu_fd_sc_mcu7t5v0__endcap instances:  78
Circuit contains 430 nets.

Circuit 1 contains 2512 devices, Circuit 2 contains 2512 devices.
Circuit 1 contains 430 nets,    Circuit 2 contains 430 nets.


Final result: 
Circuits match uniquely.
.
Logging to file "/content/OpenLane/designs/spm/runs/RUN_2022.09.22_05.46.35/logs/signoff/29-spm.lef.log" disabled
LVS Done.

proppy avatar Sep 22 '22 05:09 proppy

I think that means it could related to one of those three changes:

  • https://github.com/RTimothyEdwards/netgen/commit/9297090dc1f4896f724c4b5beacdc60aab51df22
  • https://github.com/RTimothyEdwards/netgen/commit/4fa4d046c893c3e31c44402e13d499021336f642
  • https://github.com/RTimothyEdwards/netgen/commit/cc5f6d929f8f1f71cc4c3411943f0806ee19c95b

Curious if it would make sense to test them in isolation, given that they are referring to the same feature?

proppy avatar Sep 22 '22 05:09 proppy

@proppy : I don't think it's directly related to the proxy pin issue but could be caused by the same code modification, but I think it is most likely that the code modification changed the text output of the comparison, which broke the count_lvs.py script, which makes various assumptions about the format of the output text.

I am going to revert the netgen modification and redo it in a different way; there is a very useful bit of code there that handles cases where a pin gets disconnected from an internal net, and reports the internal net name with "not a pin" instead of just reporting "no matching pin" (i.e., it gives much more useful information to the user to help in debugging the issue). So I want to implement that code, only without breaking every existing LVS script.

RTimothyEdwards avatar Sep 30 '22 15:09 RTimothyEdwards

@RTimothyEdwards Can I have a day to see if I can come up with a solution to the implicit verilog pin problem? For people doing LEF LVS, we could tell them to use 1.5.228.

d-m-bailey avatar Sep 30 '22 15:09 d-m-bailey

@d-m-bailey : I'm reverting back to the state before I modified MatchPins() for now (version 1.5.234). If you want to work on a different solution, you can start from 1.5.233 if you like, and if that works I can always do another revert back to there and then apply your new commit.

RTimothyEdwards avatar Sep 30 '22 15:09 RTimothyEdwards

I believe this is fixed now

kareefardi avatar Jan 31 '23 10:01 kareefardi