forked from efabless/caravel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun_caravel_lvs_3.sh
executable file
·161 lines (142 loc) · 6.96 KB
/
run_caravel_lvs_3.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/bash
#
# run_caravel_lvs_3.sh ---
#
# Run LVS on caravel. Read GDS using the recipe developed for open_pdks.
# Read I/O cells from vendor GDS first so that they get replaced.
#
echo ${PDK_ROOT:=/usr/share/pdk} >/dev/null
echo ${PDK:=sky130A} >/dev/null
echo ${CARAVEL_ROOT:=/home/tim/gits/caravel} >/dev/null
echo ${LITEX_ROOT:=/home/tim/gits/caravel_mgmt_soc_litex} >/dev/null
# echo "Running LVS on caravel."
# if [ $# -eq 0 ]; then
# echo "No arguments---running LVS on existing spice if it exists."
# elif [ $1 == "extract" ]; then
# echo "Forced new extraction."
# rm -f $CARAVEL_ROOT/spi/lvs/caravel.spice
# else
# echo "Ending without running LVS."
# exit 0
# fi
# if [ ! -f $CARAVEL_ROOT/spi/lvs/caravel.spice ]; then
magic -dnull -noconsole -rcfile $PDK_ROOT/$PDK/libs.tech/magic/$PDK.magicrc <<EOF
drc off
crashbackups stop
# ! This recipe taken from open_pdks/sky130/custom/scripts/gds_import_io.tcl
gds flatten true
gds flatglob *_cdns_*
gds flatglob *sky130_fd_pr__*_example_*
# ! flatten within the 120x2 ESD device
gds flatglob *sky130_fd_io__gnd2gnd_*
# The following cells have to be flattened for the gpiov2 pad to read in
# correctly, and produce a layout that can be extracted and generate an
# LVS clean netlist.
### flatten within the analog mux isolated P region
gds flatglob *sky130_fd_io__amx*
gds flatglob *sky130_fd_io__xor*
gds flatglob *sky130_fd_io__gpiov2_amx*
gds flatglob *sky130_fd_io__gpiov2_amux*
### flatten within the isolated VSSIO domain
gds flatglob *sky130_fd_io__feas_com_pupredrvr*
gds flatglob *sky130_fd_io__com_pupredrvr_strong_slowv2*
gds flatglob *sky130_fd_io__com_pdpredrvr_pbiasv2*
gds flatglob *sky130_fd_io__gpiov2_pdpredrvr_strong*
### flatten in opathv2
gds flatglob *sky130_fd_io__com_pudrvr_strong_slowv2*
gds flatglob *sky130_fd_io__com_pdpredrvr_strong_slowv2*
gds flatglob *sky130_fd_io__gpiov2_obpredrvr*
gds flatglob *sky130_fd_io__hvsbt_*
### flatten in ipath
gds flatglob *sky130_fd_io__gpiov2_ictl_logic*
### avoid splitting a netlist that passes in contorted ways through the
### layout hierarchy
gds flatglob *sky130_fd_io__gpio_pddrvr_strong_slowv2*
gds flatglob *sky130_fd_io__gpiov2_pddrvr_strong*
gds read $PDK_ROOT/$PDK/libs.ref/sky130_fd_io/gds/sky130_fd_io.gds
gds read $PDK_ROOT/$PDK/libs.ref/sky130_fd_io/gds/sky130_ef_io.gds
# Now assert that existing views must take precedence
gds noduplicates true
# GDS is still written in legacy mode
cif istyle sky130(legacy)
# And read in the full chip (except for cells already read)
gds read $CARAVEL_ROOT/gds/caravel.gds
load caravel
select top cell
expand
extract do local
extract no all
extract do aliases
extract unique
extract all
ext2spice lvs
ext2spice -o $CARAVEL_ROOT/spi/lvs/caravel.spice caravel.ext
EOF
rm *.ext
# fi
cat >netgenD.tcl <<EOF
set circuit1 [readnet spice $CARAVEL_ROOT/spi/lvs/caravel.spice]
set circuit2 [readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_sram_macros/spice/sky130_sram_2kbyte_1rw1r_32x512_8.spice]
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_sram_macros/spice/sky130_sram_1kbyte_1rw1r_32x256_8.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_sram_macros/spice/sky130_sram_1kbyte_1rw1r_8x1024_8.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_sram_macros/spice/sram_1rw1r_32_256_8_sky130.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_io/spice/sky130_ef_io.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_io/spice/sky130_fd_io.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_io/spice/sky130_ef_io__analog_pad.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/spice/sky130_ef_sc_hd__decap_12.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/spice/sky130_ef_sc_hd__fill_4.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/spice/sky130_fd_sc_hd.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/spice/sky130_ef_sc_hd__fill_8.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/spice/sky130_ef_sc_hd__fill_12.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/spice/sky130_ef_sc_hd__fakediode_2.spice \$circuit2
readnet spice $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hvl/spice/sky130_fd_sc_hvl.spice \$circuit2
readnet spice $CARAVEL_ROOT/xschem/simple_por.spice \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/constant_block.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/gpio_defaults_block.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/xres_buf.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/empty_macro.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/manual_power_connections.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/spare_logic_block.v \$circuit2
readnet verilog $MCW_ROOT/verilog/gl/RAM128.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/gpio_logic_high.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/caravel_clocking.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/mprj_logic_high.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/housekeeping.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/mprj_io_buffer.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/mprj2_logic_high.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/mgmt_protect_hv.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/chip_io.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/open_source.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/caravel_core.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/caravel_motto.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/user_id_textblock.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/copyright_block.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/caravel_logo.v \$circuit2
readnet verilog $CARAVEL_ROOT/verilog/gl/caravel.v \$circuit2
# Cells in management core wrapper (layout) are prefixed with RL_ or KF_
set cells1 [cells list -all \$circuit1]
set cells2 [cells list -all \$circuit2]
foreach cell \$cells1 {
if {[regexp ".._(.+)" \$cell match cellname]} {
if {([lsearch \$cells2 \$cell] < 0) && ([lsearch \$cells2 \$cellname] >= 0) && ([lsearch \$cells1 \$cellname] < 0)} {
equate classes "\$circuit1 \$cell" "\$circuit2 \$cellname"
puts stdout "Matching pins of \$cell in circuit 1 and \$cellname in circuit 2"
equate pins "\$circuit1 \$cell" "\$circuit2 \$cellname"
}
}
# Ignore fill cells in standard cell sets that have two-letter prefixes.
if {[regexp {.._sky130_fd_sc_[^_]+__fill_[[:digit:]]+} \$cell match]} {
ignore class "\$circuit1 \$cell"
}
}
# Run LVS
flatten class "\$circuit2 user_project_wrapper"
flatten class "\$circuit2 manual_power_connections"
flatten class "\$circuit2 empty_macro"
lvs "\$circuit1 caravel" "\$circuit2 caravel" $PDK_ROOT/$PDK/libs.tech/netgen/${PDK}_setup.tcl caravel_3_comp.out -json
EOF
export NETGEN_COLUMNS=90
export MAGIC_EXT_USE_GDS=1
netgen -batch source netgenD.tcl 2>&1 | tee caravel_3_lvs.log
rm netgenD.tcl
exit 0