2023-06-08 08:53:51 -05:00
|
|
|
#!/bin/bash
|
|
|
|
#
|
|
|
|
# Run LVS on the Openframe layout and verilog.
|
|
|
|
# If the layout netlist does not exist, then generate it from the
|
|
|
|
# extracted .mag layout of the caravel_openframe top level. The
|
|
|
|
# LVS script for netgen will read both top level netlists and then
|
|
|
|
# compare the padframe cell.
|
|
|
|
#
|
|
|
|
# Run this script in the mag/ directory.
|
|
|
|
#
|
|
|
|
echo ${PDK_ROOT:=/usr/share/pdk} > /dev/null
|
|
|
|
echo ${PDK:=sky130A} > /dev/null
|
|
|
|
|
|
|
|
if [ ! -f caravel_openframe.spice ]; then
|
|
|
|
magic -dnull -noconsole -rcfile $PDK_ROOT/$PDK/libs.tech/magic/$PDK.magicrc << EOF
|
|
|
|
drc off
|
|
|
|
crashbackups stop
|
|
|
|
load caravel_openframe
|
|
|
|
select top cell
|
|
|
|
expand
|
|
|
|
extract do local
|
|
|
|
# Maybe not do parasitic extraction for LVS??
|
|
|
|
extract no all
|
|
|
|
extract all
|
|
|
|
ext2spice lvs
|
|
|
|
ext2spice
|
|
|
|
EOF
|
|
|
|
rm -f *.ext
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Set the USE_POWER_PINS definition, which is not set anywhere else.
|
|
|
|
cat > local_defs.v << EOF
|
|
|
|
\`define USE_POWER_PINS 1
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Generate script for netgen
|
|
|
|
|
|
|
|
cat > netgen.tcl << EOF
|
|
|
|
|
|
|
|
# Load top level netlists
|
|
|
|
|
|
|
|
puts stdout "Reading layout netlist:"
|
|
|
|
set circuit1 [readnet spice caravel_openframe.spice]
|
|
|
|
puts stdout "Reading verilog and schematic netlists:"
|
|
|
|
puts stdout "Reading SPICE netlists of I/O:"
|
|
|
|
set circuit2 [readnet spice $PDK_ROOT/$PDK/libs.ref/sky130_fd_io/spice/sky130_fd_io.spice]
|
2023-09-25 18:26:09 -05:00
|
|
|
readnet spice $PDK_ROOT/$PDK/libs.ref/sky130_fd_io/cdl/sky130_ef_io.cdl \$circuit2
|
2023-06-08 08:53:51 -05:00
|
|
|
readnet spice $PDK_ROOT/$PDK/libs.ref/sky130_fd_sc_hd/spice/sky130_fd_sc_hd.spice \$circuit2
|
|
|
|
readnet spice $PDK_ROOT/$PDK/libs.ref/sky130_fd_sc_hd/spice/sky130_ef_sc_hd__decap_12.spice \$circuit2
|
|
|
|
readnet spice $PDK_ROOT/$PDK/libs.ref/sky130_fd_sc_hvl/spice/sky130_fd_sc_hvl.spice \$circuit2
|
|
|
|
readnet spice ../xschem/simple_por.spice \$circuit2
|
|
|
|
puts stdout "Reading all gate-level verilog submodules:"
|
|
|
|
readnet verilog local_defs.v \$circuit2
|
|
|
|
readnet verilog ../verilog/rtl/defines.v \$circuit2
|
|
|
|
readnet verilog ../verilog/rtl/pads.v \$circuit2
|
|
|
|
|
|
|
|
# NOTE: __openframe_project_wrapper.v is empty.
|
|
|
|
readnet verilog ../verilog/rtl/__openframe_project_wrapper.v \$circuit2
|
|
|
|
readnet verilog ../verilog/gl/user_id_programming.v \$circuit2
|
|
|
|
readnet verilog ../verilog/gl/constant_block.v \$circuit2
|
|
|
|
readnet verilog ../verilog/gl/xres_buf.v \$circuit2
|
|
|
|
|
|
|
|
# ALSO NOTE: Top-level modules are in the RTL directory but are purely gate level.
|
|
|
|
readnet verilog ../verilog/rtl/chip_io_openframe.v \$circuit2
|
|
|
|
readnet verilog ../verilog/rtl/caravel_openframe.v \$circuit2
|
|
|
|
puts stdout "Done reading netlists."
|
|
|
|
|
|
|
|
# Temporary: Flatten the user project wrapper in the verilog netlist (better solution is to
|
|
|
|
# abstract the user project wrapper in the layout and re-extract).
|
|
|
|
flatten class "\$circuit2 openframe_project_wrapper"
|
|
|
|
|
|
|
|
# Run LVS on the chip_io_openframe cells in layout and verilog.
|
|
|
|
|
|
|
|
lvs "\$circuit1 caravel_openframe" "\$circuit2 caravel_openframe" \
|
|
|
|
$PDK_ROOT/$PDK/libs.tech/netgen/${PDK}_setup.tcl \
|
|
|
|
caravel_openframe_comp.out
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
|
|
export NETGEN_COLUMNS=60
|
|
|
|
netgen -batch source netgen.tcl
|
|
|
|
rm local_defs.v
|
|
|
|
rm netgen.tcl
|