Aleksandar Pajkanovic
10/17/2023, 7:47 PMAleksandar Pajkanovic
10/17/2023, 8:20 PMdac_cell1
- just four transistors and one resistor.
This cell is DRC and LVS clean (checked in local computer) and I gave my best shot in getting it into the caravan by:
1. instantiated symbol of our cell into xschem/user_analog_project_wrapper.sch
using Xschem
2. connected it to pins like vdda1
, vssa1
(hoping that's the GND), and then io_analog[0]
etc.
3. instantiated layout (.mag
) of our cell into mag/user_analog_project_wrapper.mag
using Magic
4. connected ports of our cell to various pins in layout, just the same like in schematic, see image attachedAleksandar Pajkanovic
10/17/2023, 8:21 PMContents of circuit 1: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 8 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 4
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 16 nets, and 9 disconnected pins.
Contents of circuit 2: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 8 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 4
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 10 nets.
Circuit was modified by parallel/series device merging.
New circuit summary:
Contents of circuit 1: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 2 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 1
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 1
Circuit contains 15 nets, and 6 disconnected pins.
Contents of circuit 2: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 5 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 1
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 9 nets.
Circuit 1 contains 2 devices, Circuit 2 contains 5 devices. *** MISMATCH ***
Circuit 1 contains 6 nets, Circuit 2 contains 9 nets. *** MISMATCH ***
Flattening non-matched subcircuits dac_cell1 dac_cell1
Flattening instances of dac_cell1 in file ../mag/user_analog_project_wrapper.spice
Flattening instances of dac_cell1 in file ../xschem/user_analog_project_wrapper.spice
Contents of circuit 1: Circuit: 'user_analog_project_wrapper'
Circuit user_analog_project_wrapper contains 12 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 1
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 1
Class: sky130_fd_pr__res_generic_m3 instances: 10
Circuit contains 35 nets, and 652 disconnected pins.
Contents of circuit 2: Circuit: 'user_analog_project_wrapper'
Circuit user_analog_project_wrapper contains 5 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 1
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 9 nets, and 656 disconnected pins.
Circuit 1 contains 12 devices, Circuit 2 contains 5 devices. *** MISMATCH ***
Circuit 1 contains 26 nets, Circuit 2 contains 9 nets. *** MISMATCH ***
Final result:
Netlists do not match.
Logging to file "comp.out" disabled
LVS Done.
Please note this is only one of the subcells of our, much larger design - I wanted to start with the simplest piece, so that's why there are only 4 transistors. Note, further, how netgen detects some resistors in the layout somewhere... I did not make them, nor they exist in our cell... Could it be that they remain somehow from that power-on example?
Also, note how in the beginning netgen successfully recognizes 4 transistors in both the schematic and layout, but then, for some reason, merges transistors in the layout extracted netlist, although they are obviously not paralel nor series, rather independent devices... Why does this happen?
For completeness, here is the command I used for netgen:
netgen -batch lvs "../mag/user_analog_project_wrapper.spice user_analog_project_wrapper" "../xschem/user_analog_project_wrapper.spice user_analog_project_wrapper" /opt/open_pdks/sky130/sky130A/libs.tech/netgen/setup.tcl
Aleksandar Pajkanovic
10/17/2023, 8:22 PMAleksandar Pajkanovic
10/17/2023, 8:24 PMAleksandar Pajkanovic
10/17/2023, 8:34 PMdac_cell1
alone, i.e. dac_cell1.sch
vs dac_cell.mag
only to point out that netgen works fine and our design is DRC and LVS clean. If anyone clones the repo, here's how to repeat that result (from the netgen
directory):
netgen -batch lvs "../mag/layout_cell1/dac_cell1.spice dac_cell1" "../xschem/dac_cell1.spice dac_cell1" /opt/open_pdks/sky130/sky130A/libs.tech/netgen/setup.tcl
and the output:
Contents of circuit 1: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 8 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 4
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 10 nets.
Contents of circuit 2: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 8 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 4
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 10 nets.
Circuit was modified by parallel/series device merging.
New circuit summary:
Contents of circuit 1: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 5 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 1
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 9 nets.
Contents of circuit 2: Circuit: 'dac_cell1'
Circuit dac_cell1 contains 5 device instances.
Class: sky130_fd_pr__res_xhigh_po_0p69 instances: 1
Class: sky130_fd_pr__pfet_g5v0d10v5 instances: 4
Circuit contains 9 nets.
Circuit 1 contains 5 devices, Circuit 2 contains 5 devices.
Circuit 1 contains 9 nets, Circuit 2 contains 9 nets.
No more changes can be made to series/parallel networks.
Final result:
Circuits match uniquely.
.
Logging to file "comp.out" disabled
LVS Done.
Tim Edwards
10/17/2023, 8:45 PMdac_cell1
alone but not user_analog_project_wrapper
? I can take a look at it.Aleksandar Pajkanovic
10/17/2023, 8:56 PMdac_cell1
) itself is DRC and LVS clean and I am pretty sure I connected it (not very pretty but) electrically correct within the user_analog_project_wrapper
However, I am getting some strange extra resistors after layout extraction...
By the way, extraction I do with:
extract all
ext2spice lvs
ext2spice
Tim Edwards
10/17/2023, 9:01 PMuser_analog_project_wrapper.spice
file, because the subcircuit definition of sky130_fd_pr__pfet_g5v0d10v5_FGUWVM
has no pins. I am unable to repeat the problem on my end. I think it probably has something to do with your version of magic, which appears to be a bit out of date, as it is generating output like w=1e+06u
(which has more recently been improved to read w=1.0
now).
By doing an extraction with my own version of magic, the dac_cell1
matches at the top level, and the only issue with the top level is that the metal3 resistors that separate the nets in the layout are missing from the schematic and need to be added.Tim Edwards
10/17/2023, 9:03 PMextract no all
before extract all
when extracting for LVS, since it skips all the parasitic capacitance calculations. For large layouts that can get very compute-intensive.)Aleksandar Pajkanovic
10/17/2023, 9:05 PMpor_example
schematic - but I deleted them, I thought they were part of the example... Am I understanding you correctly, @Tim Edwards, should I have kept them in the schematic?Aleksandar Pajkanovic
10/17/2023, 9:06 PMTim Edwards
10/17/2023, 9:08 PMclamp_io_low
and clamp_io_high
pins.Tim Edwards
10/17/2023, 9:13 PMio_oeb[16]
io_oeb[15]
, io_oeb[12]
, and io_oeb[11]
.Aleksandar Pajkanovic
10/17/2023, 9:15 PMcaravan
as a project, great. Actually, I wasn't able to locate them - I didn't realize where they were... never occurred to me to look for an analog of findlabel
, something like finddevice
or similar... I'll take a look.
Anyway, thanks, I'll do that and will be back soon. Thanks!Tim Edwards
10/17/2023, 9:22 PMrm3
layers will now be at the box corners.Tim Edwards
10/17/2023, 9:24 PMoeb
pins to ground or 1.8V power to turn them permanently on or off, not bothering to use logic gates; so then a metal resistor has to be placed or else the oeb
pin gets absorbed into the power or ground net, disappears, and shows up as a port error in LVS.Aleksandar Pajkanovic
10/17/2023, 9:25 PMAleksandar Pajkanovic
10/17/2023, 9:25 PMio_clamp_low[0]
to delete - there's just a piece of metal3 that leads to nowhere...Aleksandar Pajkanovic
10/17/2023, 9:26 PMAleksandar Pajkanovic
10/17/2023, 9:27 PMTim Edwards
10/17/2023, 9:27 PMAleksandar Pajkanovic
10/17/2023, 9:27 PMsee no *
<== yet another example of great syntax πTim Edwards
10/17/2023, 9:29 PMvsw
on io_analog[7]
and iref
on io_analog[4]
but your layout has vsw
on io_analog[3]
and iref
on io_analog[7]
. Once you remove the m3 resistors, that's the only error in the layout (or schematic, since modifying the schematic to match is probably easier).Tim Edwards
10/17/2023, 9:30 PMAleksandar Pajkanovic
10/17/2023, 9:36 PMTim Edwards
10/17/2023, 9:47 PMAleksandar Pajkanovic
10/17/2023, 10:07 PMbox values {*}[select bbox]
?Tim Edwards
10/17/2023, 11:27 PMsee no *; see rm3
is a lot better. But for the obscure command above: select bbox
returns the coordinates of the bounding box of the selection. The value is a Tcl list, but box values
takes four individual values, not a list, so the {*}
expression expands the list (a quirky shorthand introduced in a fairly recent Tcl version).Aleksandar Pajkanovic
10/18/2023, 7:00 AMAleksandar Pajkanovic
10/18/2023, 7:00 AMTim Edwards
10/18/2023, 1:07 PMTim Edwards
10/18/2023, 1:08 PMTim Edwards
10/18/2023, 1:08 PMTim Edwards
10/18/2023, 1:10 PMAleksandar Pajkanovic
10/18/2023, 1:11 PMAleksandar Pajkanovic
10/18/2023, 1:11 PMTim Edwards
10/18/2023, 1:11 PMAleksandar Pajkanovic
10/18/2023, 1:12 PMAleksandar Pajkanovic
10/18/2023, 1:12 PMAleksandar Pajkanovic
10/18/2023, 1:13 PMTim Edwards
10/18/2023, 1:14 PMTim Edwards
10/18/2023, 1:14 PMTim Edwards
10/18/2023, 1:18 PMAleksandar Pajkanovic
10/18/2023, 1:19 PMAleksandar Pajkanovic
10/18/2023, 2:20 PMsss
selects both gnd
and two more nodes in layout... but watching this output... I don't see anything that could help me conclude where in layout, which box, to look for the unwanted cross. Is it even supposed to produce something like that?Aleksandar Pajkanovic
10/18/2023, 2:21 PMTim Edwards
10/18/2023, 2:34 PMsky130_fd_pr__pfet_g5v0d10v5 (3) |sky130_fd_pr__pfet_g5v0d10v5 (26->1) **Mismatch**
sky130_fd_pr__nfet_g5v0d10v5 (5) |sky130_fd_pr__nfet_g5v0d10v5 (14->3) **Mismatch**
In the layout (right-hand side), the pFETs have all been combined in parallel; after parallel combining, there is only one pFET and three nFETs, compared to three pFETs and five nFETs in the schematic.
I can't tell more without looking at the layout or netlist.Aleksandar Pajkanovic
10/18/2023, 2:36 PMAleksandar Pajkanovic
10/18/2023, 2:37 PM.spice
is a netlist from xschemAleksandar Pajkanovic
10/18/2023, 2:37 PMAleksandar Pajkanovic
10/18/2023, 2:38 PMAleksandar Pajkanovic
10/18/2023, 2:39 PMAleksandar Pajkanovic
10/18/2023, 2:42 PMTim Edwards
10/18/2023, 2:43 PMsss
on the power net, you'll see that you have a power/ground short. With that selected, do: select short power ground
. That reduces the selection to a single path (not necessarily the shortest) between power and ground.
From that, you can see that the short is across device instance XM5.Aleksandar Pajkanovic
10/18/2023, 2:44 PMTim Edwards
10/18/2023, 2:44 PMmcon
contact covering both source and drain from top to bottom.Tim Edwards
10/18/2023, 2:45 PMAleksandar Pajkanovic
10/18/2023, 2:46 PMAleksandar Pajkanovic
10/18/2023, 2:46 PMTim Edwards
10/18/2023, 2:46 PMAleksandar Pajkanovic
10/18/2023, 2:51 PMTim Edwards
10/18/2023, 2:52 PMAleksandar Pajkanovic
10/18/2023, 2:55 PMTim Edwards
10/18/2023, 2:55 PMAleksandar Pajkanovic
10/23/2023, 8:47 AMuser_analog_project_wrapper
layout and drc check
with style drc(full)
passes successfully in our local server. After that, I've created gds by simply doing gds write user_analog_project_wrapper
. However, the precheck
job returns DRC violations... It seems that something is off-grid... but how if drc check
in magic showed it's a clean design?Aleksandar Pajkanovic
10/23/2023, 8:52 AMAleksandar Pajkanovic
10/23/2023, 10:52 AMUNIC-CASS
slack workspace, here. Sorry, this is our first time submitting for analog caravel tape-out and I am having trouble understanding all the processes happening around the submission. Wherever we understand the issue sooner, I'll also forward the solution to the other thread. Thanks for understanding.Tim Edwards
10/23/2023, 12:53 PMTim Edwards
10/23/2023, 1:13 PMAleksandar Pajkanovic
10/23/2023, 1:18 PMAleksandar Pajkanovic
10/23/2023, 1:18 PMAleksandar Pajkanovic
10/23/2023, 1:19 PMAleksandar Pajkanovic
10/23/2023, 1:20 PMAleksandar Pajkanovic
10/23/2023, 1:21 PMdrc check
didn't complain so I let it beTim Edwards
10/23/2023, 1:25 PMTim Edwards
10/23/2023, 1:28 PMAleksandar Pajkanovic
10/23/2023, 1:31 PMuser_analog_project_wrapper
and ask it to do drc check
Aleksandar Pajkanovic
10/23/2023, 1:32 PMAleksandar Pajkanovic
10/23/2023, 1:32 PMTim Edwards
10/23/2023, 1:33 PMTim Edwards
10/23/2023, 1:34 PMsky130A-GDS.tech
technology file; it gives a view of the actual GDS layers.)Aleksandar Pajkanovic
10/23/2023, 1:37 PMTim Edwards
10/23/2023, 1:38 PMAleksandar Pajkanovic
10/23/2023, 1:39 PMAleksandar Pajkanovic
10/23/2023, 1:51 PMAleksandar Pajkanovic
10/23/2023, 1:52 PMAleksandar Pajkanovic
10/23/2023, 1:56 PMselect metal3 at 1645.97 3520
but it didn't work... Is there a way to tell in the magic console where I want the selection, irrelevant of the material?Aleksandar Pajkanovic
10/23/2023, 2:00 PMm2c
layer? Is there a way to turn that on?Tim Edwards
10/23/2023, 2:04 PMAleksandar Pajkanovic
10/23/2023, 2:05 PMAleksandar Pajkanovic
10/23/2023, 2:07 PMiref
I see now there is an extra viali
in the same location, as well... It probably has nothing to do with any of the errors, but still, kicking it outTim Edwards
10/23/2023, 2:07 PMbox position 1645.97um 3520um ; select
(2) The cuts can be seen either by reading the GDS with magic -T $PDK_ROOT/sky130A/libs.tech/magic/sky130A-GDS.tech
. In the layout with the usual tech file, you can do `cif see VIA1`; however, that does not show the error because it flattens the area first so the problem with the subcell disappears (hmmm, there should be a way to do that properly, but that's software development work).Tim Edwards
10/23/2023, 2:09 PMAleksandar Pajkanovic
10/23/2023, 2:10 PMAleksandar Pajkanovic
10/23/2023, 2:13 PMdac_top_cell.mag
now it is showing up!Aleksandar Pajkanovic
10/23/2023, 2:14 PMAleksandar Pajkanovic
10/23/2023, 2:30 PMAleksandar Pajkanovic
10/23/2023, 3:59 PMAleksandar Pajkanovic
10/23/2023, 3:59 PMMitch Bailey
10/23/2023, 5:25 PM2023-10-23 07:28:07 - [CRITICAL] - {{FAILURE}} 3 Check(s) Failed: ['XOR', 'Klayout BEOL', 'Klayout Pin Label Purposes Overlapping Drawing'] !!!
XOR
is a check to verify that nothing relevant has changed in the caravel_core
- user_analog_project_wrapper
interface. The xor_check.log
show that there are 4 differences on the 70/20
(metal3/drawing
) layer.
--- Running XOR for 70/20 ---
"input" in: xor.rb.drc:39
Polygons (raw): 188 (flat) 188 (hierarchical)
Elapsed: 0.000s Memory: 548.00M
"input" in: xor.rb.drc:39
Polygons (raw): 184 (flat) 184 (hierarchical)
Elapsed: 0.000s Memory: 548.00M
"^" in: xor.rb.drc:39
Polygons (raw): 4 (flat) 4 (hierarchical)
Elapsed: 0.000s Memory: 548.00M
XOR differences: 4
"output" in: xor.rb.drc:43
Polygons (raw): 4 (flat) 4 (hierarchical)
Elapsed: 0.000s Memory: 548.00M
You can check these by reading user_analog_project_wrapper.xor.gds
The second error Klayout BEOL
is a drc error from the back end rule deck.
Looks like there are some via
rules violated. This is the marker file you can load in klayout.
outputs/reports/klayout_beol_check.xml
The third error Klayout Pin Label Purposes Overlapping Drawing
is actually a check for pin/label shapes that are NOT inside drawing layers. These are not mask layers but are extracted as if were. If you have pins outside of drawing layers, they can cause nodes to be connected when extracting but will not be when the device is actually made.
See klayout_pin_label_purposes_overlapping_drawing_check.log
13 70/16: met3, pin/label not-over drawing:70/20
---- met3:70/20/dat 70/16/dat 70/5/EMP
---- via3:70/44/dat 70/48/EMP
4 71/16: met4, pin/label not-over drawing:71/20
---- met4:71/20/dat 71/16/dat 71/5/EMP
---- via4:71/44/EMP 71/48/EMP
4 72/16: met5, pin/label not-over drawing:72/20
---- met5:72/20/dat 72/16/dat 72/5/EMP
---- pad:76/20/EMP 76/5/EMP 76/16/EMP
---- pnp:82/44/EMP 82/59/EMP
---- npn:82/20/EMP 82/5/EMP
---- rdl:74/20/EMP 74/16/EMP 74/5/EMP
---- inductor:82/24/EMP 82/25/EMP
21 total error(s) among 3 error type(s), 33 checks, cell: user_analog_project_wrapper
The marker database is at outputs/reports/klayout_pin_label_purposes_overlapping_drawing_check.xml
Aleksandar Pajkanovic
10/23/2023, 5:53 PMAleksandar Pajkanovic
10/23/2023, 5:54 PMAleksandar Pajkanovic
10/23/2023, 5:54 PMMitch Bailey
10/23/2023, 6:06 PMAleksandar Pajkanovic
10/23/2023, 6:09 PMMitch Bailey
10/23/2023, 6:10 PMAleksandar Pajkanovic
10/23/2023, 6:10 PMlogs
and output
I got from efabless precheck - does that require the container or it can be done via KLAyout directly?Aleksandar Pajkanovic
10/23/2023, 6:10 PMAleksandar Pajkanovic
10/23/2023, 6:11 PMlogs
and output
from efabless platform precheckAleksandar Pajkanovic
10/23/2023, 9:19 PMTim Edwards
10/23/2023, 9:22 PMAleksandar Pajkanovic
10/24/2023, 6:41 AM