From 9b40c2af4aa70e1207e3076bf5700fa42e0b211d Mon Sep 17 00:00:00 2001 From: "D. Mitch Bailey" Date: Fri, 10 May 2024 20:35:29 -0700 Subject: [PATCH 1/2] Changes to be_checks to match extra_be_checks 2406 For details see the extra_be_checks repo 2406 branch. --- checks/be_checks/run_be_checks | 1 + checks/be_checks/run_extract | 335 ++++++++++++++- checks/be_checks/run_full_lvs | 23 +- checks/be_checks/run_hier_check | 7 +- checks/be_checks/tech/sky130A/cvc.models | 2 + .../tech/sky130A/lvs_config.caravel_core.json | 3 + .../tech/sky130A/lvs_config.chip_io.json | 2 +- checks/be_checks/tech/sky130A/remove_well.sed | 5 +- checks/be_checks/tech/sky130A/sky130A.tech | 361 +++++++++++----- .../be_checks/tech/sky130A/sky130A_setup.tcl | 7 +- checks/be_checks/tech/sky130B/cvc.models | 3 + .../tech/sky130B/known_abstract_filter.awk | 1 + .../tech/sky130B/lvs_config.caravel_core.json | 3 + .../tech/sky130B/lvs_config.chip_io.json | 4 +- checks/be_checks/tech/sky130B/remove_well.sed | 5 +- checks/be_checks/tech/sky130B/sky130B.tech | 389 ++++++++++++------ .../be_checks/tech/sky130B/sky130B_setup.tcl | 25 +- checks/be_checks/tech/sky130B/spi2cdl | 2 +- 18 files changed, 907 insertions(+), 271 deletions(-) diff --git a/checks/be_checks/run_be_checks b/checks/be_checks/run_be_checks index 400c4ba..2f8bb40 100755 --- a/checks/be_checks/run_be_checks +++ b/checks/be_checks/run_be_checks @@ -43,6 +43,7 @@ while [[ "$1" == "--"* ]]; do done if [[ $# -gt 4 ]]; then + echo $0 $* echo "usage: run_be_checks [--noextract] [lvs_config_file [netlist_top [layout_top [layout_file]]]]" exit 1 fi diff --git a/checks/be_checks/run_extract b/checks/be_checks/run_extract index d3f32ce..0194e04 100755 --- a/checks/be_checks/run_extract +++ b/checks/be_checks/run_extract @@ -79,23 +79,48 @@ if [[ ! -f $WORK_ROOT/layout.cells ]]; then $LVS_ROOT/run_hier_check "" "" $TOP_LAYOUT $LAYOUT_FILE "${PDK%?}_([^/_]*_)*_" fi +# Create extraction result directories. No error if they already exist. +echo "Extracting to ${EXT_DIR:=$WORK_ROOT/ext}" +rm -rf $EXT_DIR +mkdir -p $EXT_DIR + +# create work abstract file based on actual cells used (psuedo globbing) +# Will work with wildcards directly, but use psuedo globbing to check later. echo $EXTRACT_FLATGLOB | - sed 's/ */\n/g' >$WORK_ROOT/flatglob + sed 's/ */\n/g' >$EXT_DIR/flatglob +if [[ -f $WORK_ROOT/layout.cells ]]; then + sed -e 's/\*/.*/g' -e 's/^/^/' -e 's/$/$/' $EXT_DIR/flatglob | + grep -f - $WORK_ROOT/layout.cells >$EXT_DIR/flatglob.glob +else + cp $EXT_DIR/flatglob $EXT_DIR/flatglob.glob +fi -# create work abstract file based on actual cells used (pseudo globbing) +# create work abstract file based on actual cells used (psuedo globbing) echo $EXTRACT_ABSTRACT | - sed 's/ */\n/g' >$WORK_ROOT/abstract + sed 's/ */\n/g' >$EXT_DIR/abstract if [[ -f $WORK_ROOT/layout.cells ]]; then - sed -e 's/\*/.*/g' -e 's/^/^/' -e 's/$/$/' $WORK_ROOT/abstract | - grep -f - $WORK_ROOT/layout.cells >$WORK_ROOT/abstract.glob + sed -e 's/\*/.*/g' -e 's/^/^/' -e 's/$/$/' $EXT_DIR/abstract | + grep -f - $WORK_ROOT/layout.cells >$EXT_DIR/abstract.glob else - cp $WORK_ROOT/abstract $WORK_ROOT/abstract.glob + cp $EXT_DIR/abstract $EXT_DIR/abstract.glob fi -# Add any cells that should be flattened before extraction to 'flatten'. globbing allowed. -export FLATGLOB_CELLS="$(cat $WORK_ROOT/flatglob 2>/dev/null | grep -v '^#')" -# Add any empty cells that should be extracted as black-boxes to 'abstract'. (globbed version is 'abstract.glob') -export ABSTRACT_CELLS="$(cat $WORK_ROOT/abstract.glob 2>/dev/null | grep -v '^#')" +# create work subcut file based on actual cells used (psuedo globbing) +echo $EXTRACT_CREATE_SUBCUT | + sed 's/ */\n/g' >$EXT_DIR/subcut +if [[ -f $WORK_ROOT/layout.cells ]]; then + sed -e 's/\*/.*/g' -e 's/^/^/' -e 's/$/$/' $EXT_DIR/subcut | + grep -f - $WORK_ROOT/layout.cells >$EXT_DIR/subcut.glob +else + cp $EXT_DIR/subcut $EXT_DIR/subcut.glob +fi + +# Add any cells that should be flattened before extraction to 'flatten'. +export FLATGLOB_CELLS="$(cat $EXT_DIR/flatglob.glob 2>/dev/null | grep -v '^#')" +# Add any empty cells that should be extracted as black-boxes to 'abstract'. +export ABSTRACT_CELLS="$(cat $EXT_DIR/abstract.glob 2>/dev/null | grep -v '^#')" +# Add any cells that should be have a subcut layer added. +export SUBCUT_CELLS="$(cat $EXT_DIR/subcut.glob 2>/dev/null | grep -v '^#')" # Verify that magic is executable. if ! which magic >&/dev/null; then @@ -103,18 +128,11 @@ if ! which magic >&/dev/null; then exit 1 fi -# Create extraction result directories. No error if they already exist. -echo "Extracting to ${EXT_DIR:=$WORK_ROOT/ext}" -mkdir -p $EXT_DIR - if [[ ! -f $LAYOUT_FILE ]]; then echo "Error: File not found: $LAYOUT_FILE" exit 2 fi -# Remove any previous extraction results -rm -rf $EXT_DIR/*.ext{,.gz} - # 1. Extract gds_file date "+BEGIN: %c" >$WORK_ROOT/$LOG_FILE start_time=$SECONDS @@ -126,15 +144,267 @@ fi if [[ $EXTRACT_TYPE == analog ]]; then echo "Extracting as analog. Top ports connected by name." >>$WORK_ROOT/$LOG_FILE export EXT_TYPE=analog + EXT_MESSAGE="connected by name (analog)" + EXT_TEXT="unique notopports" else echo "Extracting as digital. Top ports unique." >>$WORK_ROOT/$LOG_FILE export EXT_TYPE=digital + EXT_MESSAGE="unique (digital)" + EXT_TEXT="unique" fi -# script uses TOP, RUN_DIR, CIFIN_STYLE, and EXTRACT_STYLE -echo "CIFIN_STYLE: ${CIFIN_STYLE:=}" -echo "EXTRACT_STYLE: ${EXTRACT_STYLE:=}" -env TOP=$TOP_LAYOUT RUN_DIR=$EXT_DIR magic -dnull -noc -rcfile $LVS_ROOT/tech/magicrc $LVS_ROOT/scripts/gds.$EXT_TYPE.spice.tcl &1 | +# create gds abstraction script +cat > $EXT_DIR/abstract.tcl <= 0} { + cif istyle sky130($CIFIN_STYLE) + +} elseif {[string first gf180mcu $PDK] >= 0} { + cif istyle import($CIFIN_STYLE) + +} else { + puts "ERROR: Unknown PDK - $PDK" + exit 1 +} + +set last_time [orig_clock seconds] +puts "Abstracting $LAYOUT_FILE" +gds read $LAYOUT_FILE +cd $EXT_DIR +set current_time [orig_clock seconds] +puts "\nTIME: read GDS: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +# Create subcut gds +foreach cell { $SUBCUT_CELLS } { + # Adds an isosub/subcut layer to the cell. + # 1. For each cell, create a new cell with an isosub/subcut layer = boundary - ( dnwell | isosub ). + load \$cell + select top cell + set cellboundary [view bbox] ;# Save the boundary. + expand + puts stdout "Creating subcut for \$cell ..." + set subcut_cell_name \${cell}_subcut + flatten -nolabels \$subcut_cell_name ;# Flatten into a cell with a new name. + load \$subcut_cell_name + property FIXED_BBOX \$cellboundary ;# Reset the boundary after flattening. + cif ostyle subcutout + gds write \$subcut_cell_name ;# Write just the subcut layer. +} +set current_time [orig_clock seconds] +puts "\nTIME: create subcut: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +# Create abstract cells +foreach cell { $ABSTRACT_CELLS } { ;# Set abstract cells and delete all their subcell instances. + load \$cell + property LEFview true + puts "Abstracting \$cell" + set instance_list [cellname list childinst \$cell] + set instance_count [llength \$instance_list] + select top cell + select visible + set port_list [lindex [what -list] 1] + puts "instance count:\$instance_count port count:[llength \$port_list]" + if { \$instance_count > 0 || [llength \$port_list] > 10 } { + # When an abstract cell has child, all the children are extracted. + # To avoid this, delete the child instances. + # If there are many instances this can take hours. + # Split the layout up into a grid and delete by grid. + select top cell + set cell_bbox [box values] + puts "Full size \$cell_bbox" + set cell_left [lindex \$cell_bbox 0] + set cell_bottom [lindex \$cell_bbox 1] + set cell_right [lindex \$cell_bbox 2] + set cell_top [lindex \$cell_bbox 3] + set cell_height [box height] + set cell_width [box width] + see no * + set window_size 100 + set current_time [orig_clock seconds] + set start_time \$current_time + # Coordinates returned from box are in internal units. + # Without qualifiers, arguments to box are in lambda units. Force internal units with i suffix. + # Search for a region where the subcells can be deleted in under 12 seconds. Region is increased 4x each loop. + while { [expr \$current_time - \$start_time] < 3 && \$window_size < \$cell_height && \$window_size < \$cell_width } { + set start_time \$current_time + incr window_size \$window_size + box size \${window_size}i \${window_size}i + select visible + select less area * ;# unselect text + delete + set current_time [orig_clock seconds] + } + set step_estimate [expr \$cell_height / \$window_size * \$cell_width / \$window_size] + puts "Setting deletion window size to \$window_size. Estimate \$step_estimate steps." + set step_count 0 + for {set box_left \$cell_left} {\$box_left < \$cell_right} {incr box_left \$window_size} { + for {set box_bottom \$cell_bottom} {\$box_bottom < \$cell_top} {incr box_bottom \$window_size} { + incr step_count + box position \${box_left}i \${box_bottom}i + select visible + select less area * ;# unselect text + puts "Step \$step_count/\$step_estimate: deleting [llength [lindex [what -list] 2]] objects at [box values]" + delete + } + } + # Delete instances that may have been missed. + select top cell + select visible + select less area * + puts "Deleting [llength [lindex [what -list] 2]] final objects" + delete + + # Delete non-port layers. Shorted ports can cause problems in parent hierarchy. + # Deleting non-port layers should eliminate the shorts. + see * + select visible + set select_list [what -list] + see no * + foreach layer [lindex \$select_list 0] { + select area \$layer ;# select ports + if { [llength [lindex [what -list] 1]] == 0 } { + see \$layer + select visible \$layer + puts "Deleting \$layer" + delete + } + } + lef nocheck vssd1 vssd2 vccd1 vccd2 vssa1 vssa2 vdda1 vdda2 + lef write \$cell -hide -pinonly + } +} +set current_time [orig_clock seconds] +puts "\nTIME: create abstract: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time +EOF + +# Create abstract and subcut cells +magic -dnull -noc -rcfile $LVS_ROOT/tech/magicrc $EXT_DIR/abstract.tcl &1 | + tee -a $WORK_ROOT/$LOG_FILE +abstract_status=${PIPESTATUS[0]} + +# create gds extraction script +cat > $EXT_DIR/extract.tcl <= 0} { + cif istyle sky130($CIFIN_STYLE) + +} elseif {[string first gf180mcu $PDK] >= 0} { + cif istyle import($CIFIN_STYLE) + +} else { + puts "ERROR: Unknown PDK - $PDK" + exit 1 +} + +set last_time [orig_clock seconds] +foreach cell { $ABSTRACT_CELLS } { ;# Load abstract cells + if { [file exists $EXT_DIR/\$cell.lef] } { + puts "Using abstracted \$cell" + lef read $EXT_DIR/\$cell.lef + } +} + +foreach cell { $FLATGLOB_CELLS } { + gds flatglob \$cell +} +# list cells to be flattened +puts "Flattening [string map {" " "\n"} [gds flatglob]]" +gds flatten yes ;# Flattens cells with few layers +gds noduplicates yes ;# keep abstract views +puts "\nExtracting $LAYOUT_FILE" +gds read $LAYOUT_FILE +cd $EXT_DIR +set current_time [orig_clock seconds] +puts "\nTIME: read GDS: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +set flatglob_error 0 +foreach cell { $FLATGLOB_CELLS } { ;# Check for unflattened flatglob cells. + if { [llength [cellname list children \$cell]] > 0 } { + set flatglob_error 1 + puts "Could not flatten \$cell because it contains these subcells:" + foreach subcell [cellname list children \$cell] { + puts " \$subcell" + } + } +} +if { \$flatglob_error } { ;# Quit if there are unflattened flatglob cells. + exit 1 +} + +gds flatten no ;# subcut cells will have few shapes, so don't flatten them when reading their gds later. + +foreach cell { $SUBCUT_CELLS } { + # Adds an isosub/subcut layer to the cell. + # 2. Add this new cell to the original cell. + # 3. Flatten the new cell instance in the original cell. + set subcut_cell_name \${cell}_subcut + gds read \$subcut_cell_name ;# Read the subcut only cell. + load \$cell + select top cell + getcell \$subcut_cell_name child 0 0 parent 0 0 ;# Place the subcut cell at the origin. + puts "Flattening [instance list self] in \$cell" + flatten -doinplace [instance list self] ;# flatten subcut cell to place subcut layer. +} +set current_time [orig_clock seconds] +puts "\nTIME: add subcut: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +foreach cell { $ABSTRACT_CELLS } { ;# Set abstract cells + load \$cell + property LEFview true + puts "Abstracting \$cell" +} +set current_time [orig_clock seconds] +puts "\nTIME: set abstract: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +load $TOP_LAYOUT +select top cell +expand +extract no all ;# clear all flags +extract do aliases +extract do local +extract $EXT_TEXT +extract style ngspice($EXTRACT_STYLE) +extract +set current_time [orig_clock seconds] +puts "\nTIME: extract: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +ext2spice lvs +ext2spice merge conservative ;# reduce parallel devices +ext2spice short resistor ;# keep both ports but connect them with a 0 ohm resistor +ext2spice -o $TOP_LAYOUT.gds.spice $TOP_LAYOUT.ext +set current_time [orig_clock seconds] +puts "\nTIME: netlist: [orig_clock format [expr {\$current_time - \$last_time}] -gmt true -format %H:%M:%S] \n" +set last_time \$current_time + +feedback save $TOP_LAYOUT-ext2gds.spice.feedback.txt +EOF + +magic -dnull -noc -rcfile $LVS_ROOT/tech/magicrc $EXT_DIR/extract.tcl &1 | tee -a $WORK_ROOT/$LOG_FILE ext_status=${PIPESTATUS[0]} @@ -155,9 +425,30 @@ awk -f $LVS_ROOT/scripts/ext.hier.awk -v TOP=$TOP_LAYOUT $EXT_DIR/*.ext >$EXT_DI # Compress large ext files find $EXT_DIR -name '*.ext' -size +1M -exec gzip {} \; +if [[ $(grep -c 'direction reversal in path' $LOG_ROOT/$LOG_FILE) -ne 0 ]]; then + echo " +Error: invalid path reversal. See $LOG_ROOT/$LOG_FILE" + magic_status=1 +fi + +grep 'layer=' $LOG_ROOT/$LOG_FILE | + awk '/, layer=/ {print gensub(/.*, layer=/, "layer=", 1)}' | + sort -u | + comm -23 - $LVS_ROOT/tech/$PDK/known.undefined.layer >$EXT_DIR/unknown.layers +if [[ $(cat $EXT_DIR/unknown.layers | wc -w) -ne 0 ]]; then + echo " +Error: invalid layers. See $LOG_ROOT/$LOG_FILE" + cat $EXT_DIR/unknown.layers + magic_status=1 +fi + # Check that extraction completed successfully -if [[ ${magic_status:=0} -ne 0 || $(grep -c 'exttospice finished.' $LOG_ROOT/$LOG_FILE) -ne 1 ]]; then +if [[ $abstract_status -ne 0 || \ + $ext_status -ne 0 || \ + ${magic_status:=0} -ne 0 || \ + $(grep -c 'exttospice finished.' $LOG_ROOT/$LOG_FILE) -ne 1 ]]; then echo " Error: extraction did not complete successfully" exit 4 fi + diff --git a/checks/be_checks/run_full_lvs b/checks/be_checks/run_full_lvs index 896193c..1a2b862 100755 --- a/checks/be_checks/run_full_lvs +++ b/checks/be_checks/run_full_lvs @@ -113,6 +113,8 @@ if [[ -f $WORK_ROOT/layout.cells && -f $WORK_ROOT/verilog.cells ]]; then # Do pseudo globbing against layout and verilog. "*" expansion only. sed -e 's/\*/.*/g' $WORK_ROOT/flatten | grep -hx -f - $WORK_ROOT/layout.cells $WORK_ROOT/verilog.cells | + cat - $WORK_ROOT/flatten | + sed 's/^\*//' | awk 'NF > 0' | sort -u >$WORK_ROOT/flatten.glob else @@ -126,6 +128,8 @@ if [[ -f $WORK_ROOT/layout.cells && -f $WORK_ROOT/verilog.cells ]]; then # Do pseudo globbing against layout and verilog. "*" expansion only. sed -e 's/\*/.*/g' $WORK_ROOT/noflatten | grep -hx -f - $WORK_ROOT/layout.cells $WORK_ROOT/verilog.cells | + cat - $WORK_ROOT/noflatten | + sed 's/^\*//' | awk 'NF > 0' | sort -u >$WORK_ROOT/noflatten.glob else @@ -139,6 +143,8 @@ if [[ -f $WORK_ROOT/layout.cells && -f $WORK_ROOT/verilog.cells ]]; then # Do pseudo globbing against layout and verilog. "*" expansion only. sed -e 's/\*/.*/g' $WORK_ROOT/ignore | grep -hx -f - $WORK_ROOT/layout.cells $WORK_ROOT/verilog.cells | + cat - $WORK_ROOT/ignore | + sed 's/^\*//' | awk 'NF > 0' | sort -u >$WORK_ROOT/ignore.glob else @@ -243,16 +249,27 @@ awk ' /Circuit 1 .* will not flatten/ {print $4, "is a black box in the layout"} /Circuit 2 .* will not flatten/ {print $4, "is a black box in the source"} ' $WORK_ROOT/lvs.report >$WORK_ROOT/lvs.unflattened -awk -f $LVS_ROOT/tech/$PDK/known_abstract_filter.awk $WORK_ROOT/lvs.log | +awk -f $LVS_ROOT/tech/$PDK/known_abstract_filter.awk $WORK_ROOT/lvs.log | + grep -w -v $WORK_DIR/abstract.glob | awk ' /Matching pins/ {print $4, "is a black box in the layout and source"} /contains no devices/ {print $2, "contains no devices"} ' - >>$WORK_ROOT/lvs.unflattened if [[ -s $WORK_ROOT/lvs.unflattened ]]; then - echo "Warning: device level LVS may be incomplete due to $(cat $WORK_ROOT/lvs.unflattened | wc -l) unflattened cell(s): see $SIGNOFF_ROOT/lvs.unflattened" | + if grep -q -w -v -f $WORK_ROOT/abstract.glob $WORK_ROOT/lvs.unflattened; then + echo "Warning: device level LVS may be incomplete due to these unflattened cell(s): " | + tee -a $WORK_ROOT/lvs.report | + tee -a $WORK_ROOT/lvs.log + # Only set an error for unabstracted mismatches + lvs_warning=1 + else + echo "Notice: LVS completed with these abstracted cells: " | + tee -a $WORK_ROOT/lvs.report | + tee -a $WORK_ROOT/lvs.log + fi + cat $WORK_ROOT/lvs.unflattened | tee -a $WORK_ROOT/lvs.report | tee -a $WORK_ROOT/lvs.log - lvs_warning=1 fi if [[ -s $WORK_ROOT/ignore.glob ]]; then diff --git a/checks/be_checks/run_hier_check b/checks/be_checks/run_hier_check index 00e1ab9..e0e9dba 100755 --- a/checks/be_checks/run_hier_check +++ b/checks/be_checks/run_hier_check @@ -71,7 +71,7 @@ if [[ $(echo $SOURCE_FILES | wc -w) -gt 0 ]]; then sed '/^[ ]*module[ ].*[^ ](/s/(/ (/' $(echo $SOURCE_FILES) | awk -v top=$TOP_SOURCE ' - $1 ~ /^\/\*/ { + $1 ~ /^\/\*/ { # skip block comments while ( ! /\*\// ) { getline; } @@ -80,16 +80,17 @@ if [[ $(echo $SOURCE_FILES | wc -w) -gt 0 ]]; then if ( $2 in modules ) { print "Duplicate module definition", $2 > "'$WORK_ROOT/hier.log'"; } + modules[$2] = 1; if ( ! ( $2 in cells ) ) { cells[$2] = 1; } module = $2; next; } - $1 ~ /^\/\// { + $1 ~ /^[ ]*\/\// { # skip single line comments next; } - / \(/ && ! /^[ ]*\/\*/ { + / \(/ && $1 !~ /^\./ { key = module "/" $1; if ( ! ( $1 in cells ) ) { cells[$1] = 1; diff --git a/checks/be_checks/tech/sky130A/cvc.models b/checks/be_checks/tech/sky130A/cvc.models index 0d7bba5..a61a8ab 100644 --- a/checks/be_checks/tech/sky130A/cvc.models +++ b/checks/be_checks/tech/sky130A/cvc.models @@ -47,6 +47,7 @@ R sky130_fd_pr__res_high_po_5p73 R=l/5.73*300 R sky130_fd_pr__res_iso_pw R=l/w*4400 MN sky130_fd_pr__nfet_01v8 Vth=0.2 Vgs=1.8 Vds=1.8 +MN sky130_fd_pr__special_nfet_01v8 Vth=0.2 Vgs=1.8 Vds=1.8 MN sky130_fd_pr__nfet_01v8_lvt Vth=0.1 Vgs=1.8 Vds=1.8 MN sky130_fd_pr__special_nfet_latch Vth=0.2 Vgs=1.8 Vds=1.8 MN sky130_fd_pr__special_nfet_pass Vth=0.2 Vgs=1.8 Vds=1.8 @@ -59,6 +60,7 @@ MN sky130_fd_bs_flash__special_sonosfet_star Vth=0.2 MP sky130_fd_pr__pfet_01v8 Vth=-0.2 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__pfet_01v8_lvt Vth=-0.1 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__pfet_01v8_hvt Vth=-0.3 Vgs=1.8 Vds=1.8 +MP sky130_fd_pr__special_pfet_01v8_hvt Vth=-0.3 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__special_pfet_pass Vth=-0.2 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__special_pfet_latch Vth=-0.2 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__pfet_g5v0d10v5 Vth=-0.2 diff --git a/checks/be_checks/tech/sky130A/lvs_config.caravel_core.json b/checks/be_checks/tech/sky130A/lvs_config.caravel_core.json index f079e87..67b7780 100644 --- a/checks/be_checks/tech/sky130A/lvs_config.caravel_core.json +++ b/checks/be_checks/tech/sky130A/lvs_config.caravel_core.json @@ -12,6 +12,9 @@ "EXTRACT_ABSTRACT": [ "" ], + "EXTRACT_CREATE_SUBCUT": [ + "*user_project_wrapper" + ], "LVS_FLATTEN": [ "" ], diff --git a/checks/be_checks/tech/sky130A/lvs_config.chip_io.json b/checks/be_checks/tech/sky130A/lvs_config.chip_io.json index 60f589c..3141d7d 100644 --- a/checks/be_checks/tech/sky130A/lvs_config.chip_io.json +++ b/checks/be_checks/tech/sky130A/lvs_config.chip_io.json @@ -6,11 +6,11 @@ "TOP_SOURCE": "chip_io", "TOP_LAYOUT": "$TOP_SOURCE", "EXTRACT_FLATGLOB": [ + "*_CDNS_*", "*sky130_fd_pr__*example*", "*sky130_ef_io__com*", "*sky130_ef_io__connect*", "*sky130_ef_io__corner*", - "*sky130_ef_io__gpiov2_pad", "*sky130_ef_io__*_overlay", "*sky130_fd_io__amux*", "*sky130_fd_io__amx_inv1", diff --git a/checks/be_checks/tech/sky130A/remove_well.sed b/checks/be_checks/tech/sky130A/remove_well.sed index 5706283..8e3dc11 100644 --- a/checks/be_checks/tech/sky130A/remove_well.sed +++ b/checks/be_checks/tech/sky130A/remove_well.sed @@ -5,16 +5,17 @@ s/[^ ]* \(sky130_fd_pr__res_high_po\)/\1/ s/[^ ]* \(sky130_fd_pr__res_xhigh_po\)/\1/ s/[^ ]* \(sky130_fd_pr__res_generic_nd\)/\1/ s/[^ ]* \(sky130_fd_pr__res_generic_pd\)/\1/ -s/[^ ]* \(sky130_fd_pr__cap_var_lvt\)/\1/ +s/[^ ]* \(sky130_fd_pr__cap_var\)/\1/ s/[^ ]* \(sky130_fd_bs_flash__special_sonosfet_star\)/\1/ s/[^ ]* \(ppolyf_u_1k_6p0\)/\1/ s/[^ ]* \(ppolyf_u\)/\1/ s/[^ ]* \(.fet_06v0\)/\1/ /^D.* sky130_fd_pr__diode_pd2nw_/d /^D.* sky130_fd_pr__diode_pw2nd_/d +/^D.* sky130_fd_pr__model__parasitic__diode_ps2dn/d /^D.* diode_pd2nw_06v0/d /^D.* diode_nd2ps_06v0/d /^D.* np_6p0/d /^D.* pn_6p0/d -/^R.* sky130_fd_pr__res_iso_pw/d +/^[RX].* sky130_fd_pr__res_iso_pw/d /^X.* sky130_fd_pr__pnp_05v5/d diff --git a/checks/be_checks/tech/sky130A/sky130A.tech b/checks/be_checks/tech/sky130A/sky130A.tech index faec865..1e1c2b1 100644 --- a/checks/be_checks/tech/sky130A/sky130A.tech +++ b/checks/be_checks/tech/sky130A/sky130A.tech @@ -14,7 +14,7 @@ tech end version - version 1.0.446-0-gdd7771c + version 1.0.470-0-g6d4d117 description "SkyWater SKY130: Open Source rules and DRC" requires magic-8.3.411 end @@ -50,7 +50,9 @@ end # sky130_fd_pr__nfet_03v3_nvt nnfet native nFET # sky130_fd_pr__pfet_g5v0d10v5 mvpfet thickox pFET # sky130_fd_pr__nfet_g5v0d10v5 mvnfet thickox nFET -# sky130_fd_pr__nfet_01v8_nvt mvnnfet thickox native nFET +# sky130_fd_pr__nfet_05v0_nvt mvnnfet thickox native nFET +# sky130_fd_pr__nfet_g5v0d16v0 mvnfet extended-drain nFET*** +# sky130_fd_pr__pfet_g5v0d16v0 mvpfet extended-drain pFET*** # sky130_fd_pr__diode_pw2nd_05v5 ndiode n+ diff diode # sky130_fd_pr__diode_pw2nd_05v5_lvt ndiodelvt low Vt n+ diff diode # sky130_fd_pr__diode_pw2nd_05v5_nvt nndiode diode with nndiff @@ -88,6 +90,10 @@ end # outside of the standard cell except for the DRC rule for # FET to diffusion contact spacing (which is 0.05um, not 0.055um) # +# (***) The extended-drain devices have the same identifying +# FET type as the thick oxide devices, but the drain side of the +# device is represented by layer extdrain extending to nsd or psd. +# #------------------------------------------------------------- # The following devices are not extracted but are represented # only by script-generated subcells in the PDK. @@ -186,6 +192,7 @@ types active nsubdiffcont,nsubstratencontact,nsc,ntapc active mvpsubdiffcont,mvpsubstratepcontact,mvpsc,mvptapc active mvnsubdiffcont,mvnsubstratencontact,mvnsc,mvntapc + active extdrain,ed -active obsactive -active mvobsactive @@ -237,7 +244,6 @@ types metal1 rmetal1,rm1,rmet1 metal1 via1,m2contact,m2cut,m2c,via,v,v1 -metal1 obsm1 - metal1 padl -metal1 m1fill @@ -326,8 +332,6 @@ contact mimcc mimcap metal4 mim2cc mimcap2 metal5 - padl m1 m2 m3 m4 m5 glass - mrdlc metal5 mrdl pi2 mrdl ubm end @@ -412,8 +416,6 @@ aliases allm4 *m4,rm4 allm5 *m5,rm5 - allpad padl - psub pwell obstypes obswell,mvobsactive,obsactive,obsli,obsmcon,obsm1,obsm2,obsm3,obsm4,obsm5,obsmrdl,obscomment @@ -480,6 +482,8 @@ styles mvnsc ndiff_in_nwell metal1 contact_X'es hvndiff_mask mvpsc pdiff_in_pwell metal1 contact_X'es hvpdiff_mask + extdrain nselect pselect + poly polysilicon polyfill polysilicon pc polysilicon metal1 contact_X'es @@ -569,8 +573,6 @@ styles obswell cwell obsactive implant4 - padl metal6 via6 overglass - magnet substrate_field_implant rotate via3alt fence via5 @@ -663,6 +665,8 @@ end connect *nwell,*nsd,*mvnsd,dnwell,pnp,photo *nwell,*nsd,*mvnsd,dnwell,pnp,photo pwell,*psd,*mvpsd,npn,isosub pwell,*psd,*mvpsd,npn,isosub + *mvnsd ed + *mvpsd ed *li,coreli,lifill *li,coreli,lifill *m1,m1fill,obsmcon *m1,m1fill,obsmcon *m2,m2fill *m2,m2fill @@ -674,7 +678,7 @@ connect allnactivenonfet allnactivenonfet allpactivenonfet allpactivenonfet *poly,xpc,allfets,polyfill *poly,xpc,allfets,polyfill - # RDL connects to m5 (i.e., padl) through glass cut + # RDL connects to m5 through glass cut *mrdl *mrdl glass metrdl end @@ -731,9 +735,34 @@ style gdsii # NWELL #---------------------------------------------------------------- + # Identify LDMOS drain areas + templayer ndrainarea + bloat-all ed *mvnsd + and-not ed + + templayer pdrainarea + bloat-all ed *mvpsd + and-not ed + + # Generate n-well under extended-drain nFET + templayer extnwell + bloat-or *mvnsd * 0 extdrain 1150 + and-not *mvnsd + or ndrainarea + grow 660 + + # Erase n-well under extended-drain pFET + templayer extpwell + bloat-or *mvpsd * 0 extdrain 590 + and-not *mvpsd + or pdrainarea + grow 860 + layer NWELL allnwell bloat-all rpw dnwell and-not rpw,pwell + or extnwell + and-not extpwell calma 64 20 layer WELLTXT @@ -760,7 +789,13 @@ style gdsii # DIFF #---------------------------------------------------------------- + # Extended-drain FETs cut the diffusion under the gate + templayer ldbreak + bloat-or *mvnsd * 0 extdrain 1585 + bloat-or *mvpsd * 0 extdrain 1190 + layer DIFF allnactivenontap,allpactivenontap,allactiveres + and-not ldbreak calma 65 20 layer DIFFTXT @@ -829,6 +864,15 @@ style gdsii mask-hints NSDM calma 93 44 +#---------------------------------------------------------------- +# EDID (Extended drain identifier) +#---------------------------------------------------------------- + + layer EDID + bloat-all extdrain *mvnsd,*mvpsd,mvnfet,mvpfet,*mvndiff,*mvpdiff + labels extdrain + calma 81 57 + #---------------------------------------------------------------- # LVID #---------------------------------------------------------------- @@ -1015,7 +1059,9 @@ style gdsii # HVI (includes rules NWELL 8-11 and DIFFTAP 14-26) #---------------------------------------------------------------- - templayer thkox_area alldiffmv,mvvar + templayer thkox_area ed + grow 475 + or alldiffmv,mvvar grow 185 bloat-all alldiffmv nwell grow 345 @@ -1110,7 +1156,7 @@ style gdsii # POLYRES extends to edge of contact cut layer POLYRES xhrpoly,uhrpoly - grow 60 + grow 80 and xpc or xhrpoly,uhrpoly calma 66 13 @@ -1305,7 +1351,7 @@ style gdsii calma 74 16 layer PI1 *metrdl - and padl,glass + and m5,glass # Test only---needs GDS layer number layer UBM *metrdl @@ -1941,7 +1987,7 @@ style wafflefill variants (),(tiled) # diff or poly. #--------------------------------------------------------- - templayer obstruct_li_coarse allli,allpad,obsli,lifill,fillblock,fillblock4 + templayer obstruct_li_coarse allli,obsli,lifill,fillblock,fillblock4 grow 2800 or alldiff,allpoly grow 200 @@ -1953,7 +1999,7 @@ style wafflefill variants (),(tiled) shrink 1495 grow 1495 - templayer obstruct_li_medium allli,allpad,obsli,lifill,fillblock,fillblock4 + templayer obstruct_li_medium allli,obsli,lifill,fillblock,fillblock4 grow 2500 or lifill_coarse grow 300 @@ -1966,7 +2012,7 @@ style wafflefill variants (),(tiled) shrink 745 grow 745 - templayer obstruct_li_fine allli,allpad,obsli,lifill,fillblock,fillblock4 + templayer obstruct_li_fine allli,obsli,lifill,fillblock,fillblock4 or lifill_coarse,lifill_medium grow 300 or alldiff,allpoly @@ -1987,7 +2033,7 @@ style wafflefill variants (),(tiled) # MET1 fill #--------------------------------------------------- - templayer obstruct_m1_coarse allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_coarse allm1,obsm1,m1fill,fillblock,fillblock4 grow 3000 templayer met1fill_coarse topbox # slots 0 2000 200 0 2000 200 700 0 @@ -1997,7 +2043,7 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m1_medium allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_medium allm1,obsm1,m1fill,fillblock,fillblock4 grow 2800 or met1fill_coarse grow 200 @@ -2008,7 +2054,7 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m1_fine allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_fine allm1,obsm1,m1fill,fillblock,fillblock4 grow 300 or met1fill_coarse,met1fill_medium grow 200 @@ -2019,7 +2065,7 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m1_veryfine allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_veryfine allm1,obsm1,m1fill,fillblock,fillblock4 grow 100 or met1fill_coarse,met1fill_medium,met1fill_fine grow 200 @@ -2039,7 +2085,7 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET2 fill #--------------------------------------------------- - templayer obstruct_m2 allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2 allm2,obsm2,m2fill,fillblock,fillblock4 grow 3000 templayer met2fill_coarse topbox # slots 0 2000 200 0 2000 200 700 350 @@ -2049,7 +2095,7 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m2_medium allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2_medium allm2,obsm2,m2fill,fillblock,fillblock4 grow 2800 or met2fill_coarse grow 200 @@ -2060,7 +2106,7 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m2_fine allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2_fine allm2,obsm2,m2fill,fillblock,fillblock4 grow 300 or met2fill_coarse,met2fill_medium grow 200 @@ -2071,7 +2117,7 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m2_veryfine allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2_veryfine allm2,obsm2,m2fill,fillblock,fillblock4 grow 100 or met2fill_coarse,met2fill_medium,met2fill_fine grow 200 @@ -2091,7 +2137,7 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET3 fill #--------------------------------------------------- - templayer obstruct_m3 allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3 allm3,glass,obsm3,m3fill,fillblock,fillblock4 grow 3000 templayer met3fill_coarse topbox # slots 0 2000 300 0 2000 300 700 700 @@ -2101,7 +2147,7 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m3_medium allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3_medium allm3,glass,obsm3,m3fill,fillblock,fillblock4 grow 2700 or met3fill_coarse grow 300 @@ -2112,7 +2158,7 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m3_fine allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3_fine allm3,glass,obsm3,m3fill,fillblock,fillblock4 grow 200 or met3fill_coarse,met3fill_medium grow 300 @@ -2123,7 +2169,7 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m3_veryfine allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3_veryfine allm3,glass,obsm3,m3fill,fillblock,fillblock4 # Note: Adding 0.1 to waffle rule to clear wide spacing rule grow 100 or met3fill_coarse,met3fill_medium,met3fill_fine @@ -2144,7 +2190,9 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET4 fill #--------------------------------------------------- - templayer obstruct_m4 allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4 glass + grow 2500 + or allm4,obsm4,m4fill,fillblock,fillblock4 grow 3000 templayer met4fill_coarse topbox # slots 0 2000 300 0 2000 300 700 1050 @@ -2154,7 +2202,9 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m4_medium allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4_medium glass + grow 2500 + or allm4,obsm4,m4fill,fillblock,fillblock4 grow 2700 or met4fill_coarse grow 300 @@ -2165,7 +2215,9 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m4_fine allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4_fine glass + grow 5000 + or allm4,obsm4,m4fill,fillblock,fillblock4 grow 200 or met4fill_coarse,met4fill_medium grow 300 @@ -2176,7 +2228,9 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m4_veryfine allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4_veryfine glass + grow 5100 + or allm4,obsm4,m4fill,fillblock,fillblock4 # Note: Adding 0.1 to waffle rule to clear wide spacing rule grow 100 or met4fill_coarse,met4fill_medium,met4fill_fine @@ -2197,7 +2251,7 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET5 fill #--------------------------------------------------- - templayer obstruct_m5 allm5,allpad,obsm5,m5fill,fillblock + templayer obstruct_m5 allm5,glass,obsm5,m5fill,fillblock grow 3000 templayer met5fill_coarse topbox slots 0 5000 1600 0 5000 1600 1000 100 @@ -2206,7 +2260,7 @@ style wafflefill variants (),(tiled) shrink 2495 grow 2495 - templayer obstruct_m5_medium allm5,allpad,obsm5,m5fill,fillblock + templayer obstruct_m5_medium allm5,glass,obsm5,m5fill,fillblock grow 1400 or met5fill_coarse grow 1600 @@ -2221,6 +2275,27 @@ style wafflefill variants (),(tiled) or met5fill_medium calma 59 28 +style subcutout + # generates a new subcut layer from the cell boundary, with windows for existing subcut and dnwell + # should be used on a flattened layout + scalefactor 10 nanometers + options calma-permissive-labels + gridlimit 5 + + templayer CELLBOUND + boundary + + templayer large_dnwell dnwell + grow 10 + + templayer large_isosub isosub + grow 10 + + layer SUBCUT CELLBOUND + grow 10 + and-not large_dnwell + and-not large_isosub + calma 81 53 end #----------------------------------------------------------------------- @@ -2234,7 +2309,7 @@ style sky130 variants (),(vendor),(nowell) scalefactor 10 nanometers gridlimit 5 - options ignore-unknown-layer-labels no-reconnect-labels + options ignore-unknown-layer-labels ignore NPC ignore SEALID @@ -2244,6 +2319,7 @@ style sky130 variants (),(vendor),(nowell) ignore POLYMOD ignore LOWTAPDENSITY ignore FILLOBSPOLY + ignore FILLOBSFOM ignore MET5BLOCK ignore OUTLINE ignore POLYCUT @@ -2812,6 +2888,47 @@ variants * labels TAP labels TAPTXT text + # Fill in FET under extended drain + layer mvpfet EDID + and POLY + and-not DIFF + and-not TAP + and-not NWELL + + layer mvnfet EDID + and POLY + and-not DIFF + and-not TAP + and NWELL + + # Restrict where nwell is merged + templayer ldmos_nwell EDID + grow 1200 + and NWELL + + # Remove or add well under extended FET gate + layer nwell EDID + and POLY + and DIFF + and PSDM + grow 685 + or ldmos_nwell + grow 420 + shrink 420 + + layer pwell EDID + and POLY + and DIFF + and NSDM + grow 660 + grow 420 + shrink 420 + + layer ed EDID + and-not POLY + and-not DIFF + and-not TAP + templayer mvnsdexpand mvnsdarea grow 500 @@ -2918,8 +3035,8 @@ variants * templayer xpolyterm RPM,URPM and POLY and-not POLYRES - # add back the 0.06um contact surround in the direction of the resistor - grow 60 + # add back the 0.08um contact surround in the direction of the resistor + grow 80 and POLY layer xpc xpolyterm @@ -3729,8 +3846,6 @@ variants * and-not FILLOBSM5 labels FILLOBSM1,FILLOBSM2,FILLOBSM3,FILLOBSM4 - layer obsactive FILLOBSFOM - # MOS Varactor layer var POLY @@ -3778,6 +3893,8 @@ variants * calma PSDM 94 20 # HVI (THKOX) calma HVI 75 20 + # EDID + calma EDID 81 57 # NPC calma NPC 95 20 # P+ POLY MASK @@ -3825,7 +3942,7 @@ variants * calma PADDIFFID 81 6 calma PADMETALID 81 8 calma PADCENTERID 81 20 - + # LICON calma CONT 66 44 calma LI 67 20 @@ -4082,6 +4199,15 @@ variants (fast),(full) edge4way (*pdiff)/a (*nsd)/a 400 ~(*pdiff)/a 0 0 "NSDM width < %d (diff/tap.5)" edge4way (*ndiff)/a (*psd)/a 400 ~(*ndiff)/a 0 0 "PSDM width < %d (diff/tap.5)" + # Extended drain rules + edge4way space/a ed/a 5000 ~(space)/a 0 0 "LDNFET/LDPFET width < %d (denmos/depmos.2)" + edge4way (*mvndiff)/a mvnfet 1055 ~(ed)/a 0 0 "LDNFET length < %d (denmos.1)" + edge4way (*mvnsd)/a ed/a 2510 ~(*mvndiff)/a 0 0 \ + "LDNFET drain to source < %d (denmos.6 + denmos.3)" + edge4way (*mvpdiff)/a mvpfet 1050 ~(ed)/a 0 0 "LDPFET length < %d (depmos.1)" + edge4way (*mvpsd)/a ed/a 2110 ~(*mvpdiff)/a 0 0 \ + "LDPFET drain to source < %d (depmos.6 + depmos.3)" + area *nsd,*mvnsd 70110 150 "N-tap minimum area < 0.07011um^2 (nsd.10b)" area *psd,*mvpsd 70110 150 "P-tap minimum area < 0.07011um^2 (psd.10b)" @@ -4181,6 +4307,17 @@ variants (fast),(full) ~(pfetlvt,nfetlvt,pdiodelvt,ndiodelvt)/a allfetsnolvt 415 \ "Min. spacing between FET and LVTN in S/D direction < %d (lvtn.3b)" +#-------------------------------------------------------------------- +# HVNTM +#-------------------------------------------------------------------- + +variants (full) + # This requires extra spacing of hvndiff if a ptap is in between + cifwidth hvntm_generate 700 "Width of HVNTM < %d (hvntm.1)" + cifspacing hvntm_generate hvntm_generate 700 touching_ok \ + "HVNTM spacing < %d (hvntm.2)" +variants * + #-------------------------------------------------------------------- # NPC (Nitride poly Cut) #-------------------------------------------------------------------- @@ -4511,7 +4648,7 @@ variants (full) width metrdl 10000 "RDL width < %d (rdl.1)" spacing metrdl metrdl 10000 touching_ok "RDL spacing < %d (rdl.2)" surround glass metrdl 10750 absence_ok "RDL must surround glass cut by %d (rdl.3)" - spacing padl metrdl 19660 surround_ok "RDL spacing to unrelated pad < %d (rdl.6)" + spacing glass metrdl 19660 surround_ok "RDL spacing to unrelated pad < %d (rdl.6)" variants (fast),(full) @@ -5699,12 +5836,18 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_hvt pfethvt,scpfethvt \ - *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *pdiff,pdiffres *pdiff,pdiffres nwell error w>=0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_pfet_01v8_hvt scpfethvt \ + *pdiff,pdiffres *pdiff,pdiffres nwell error w<0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_01v8 nfet,scnfet \ - *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error \ + w>=0.42 l=l w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_nfet_01v8 scnfet \ + *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error \ + w<0.42 l=l w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_latch npd \ *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error l=l w=w \ a1=as p1=ps a2=ad p2=pd @@ -5748,6 +5891,10 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) device msubcircuit Ignore mvpfet *mvpdiff,mvpdiffres pwell,space/w nwell error +npn,pnp # Extended drain devices (must appear before the regular devices) + device msubcircuit sky130_fd_pr__nfet_g5v0d16v0 mvnfet *mvndiff \ + extdrain,*mvnsd pwell,space/w error l=l w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__pfet_g5v0d16v0 mvpfet *mvpdiff \ + extdrain,*mvpsd nwell error l=l w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_20v0_nvt mvnnfet *mvndiff,mvndiffres \ dnwell pwell,space/w error l=l w=w a1=as a2=ad p1=ps p2=pd device msubcircuit sky130_fd_pr__nfet_20v0 mvnfet *mvndiff,mvndiffres \ @@ -5784,29 +5931,29 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) photo pwell,space/w error a=area device rsubcircuit sky130_fd_pr__res_high_po xhrpoly \ - xpc nwell,pwell,space/w error l=l w=w + xpc nwell,pwell,space/w error l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_high_po_0p35 xhrpoly \ - xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l + xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_0p69 xhrpoly \ - xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l + xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_1p41 xhrpoly \ - xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l + xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_2p85 xhrpoly \ - xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l + xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_5p73 xhrpoly \ - xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l + xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po uhrpoly \ - xpc nwell,pwell,space/w error l=l w=w + xpc nwell,pwell,space/w error l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_xhigh_po_0p35 uhrpoly \ - xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l + xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_0p69 uhrpoly \ - xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l + xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_1p41 uhrpoly \ - xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l + xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_2p85 uhrpoly \ - xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l + xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_5p73 uhrpoly \ - xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l + xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_generic_nd ndiffres \ *ndiff pwell,space/w error l=l w=w @@ -5840,45 +5987,51 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) variants (nowell) device msubcircuit sky130_fd_pr__pfet_01v8 pfet,scpfet \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_pfet_latch ppu \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_lvt pfetlvt \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_mvt pfetmvt \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_hvt pfethvt,scpfethvt \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *pdiff,pdiffres *pdiff,pdiffres w>=0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_pfet_01v8_hvt scpfethvt \ + *pdiff,pdiffres *pdiff,pdiffres w<0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_01v8 nfet,scnfet \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *ndiff,ndiffres *ndiff,ndiffres \ + w>=0.42 l=l w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_nfet_01v8 scnfet \ + *ndiff,ndiffres *ndiff,ndiffres \ + w<0.42 l=l w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_latch npd \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_latch npd \ - *ndiff,ndiffres *srampvar l=l w=w \ + *ndiff,ndiffres *srampvar l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_pass npass \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_01v8_lvt nfetlvt \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_bs_flash__special_sonosfet_star nsonos \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device subcircuit sky130_fd_pr__cap_var_lvt varactor \ - *nndiff l=l w=w + *nndiff l=l w=w device subcircuit sky130_fd_pr__cap_var_hvt varhvt \ - *nndiff l=l w=w + *nndiff l=l w=w device subcircuit sky130_fd_pr__cap_var mvvaractor \ - *mvnndiff l=l w=w + *mvnndiff l=l w=w # Bipolars # device msubcircuit sky130_fd_pr__npn_05v5 npn *ndiff dnwell space/w error a1=area @@ -5894,13 +6047,17 @@ variants (nowell) # device msubcircuit sky130_fd_pr__npn_11v0 npn *mvndiff dnwell space/w error a1=area # device msubcircuit sky130_fd_pr__npn_11v0_W1p00L1p00 npn *mvndiff \ # dnwell space/w error a1>0.99 a1<1.01 - +# # Ignore the extended-drain FET geometry that forms part of the high-voltage # bipolar devices. # device msubcircuit Ignore mvnfet *mvndiff,mvndiffres dnwell pwell,space/w error +npn,pnp # device msubcircuit Ignore mvpfet *mvpdiff,mvpdiffres pwell,space/w nwell error +npn,pnp # Extended drain devices (must appear before the regular devices) +# device msubcircuit sky130_fd_pr__nfet_g5v0d16v0 mvnfet *mvndiff \ +# extdrain,*mvnsd pwell,space/w error l=l w=w a1=as p1=ps a2=ad p2=pd +# device msubcircuit sky130_fd_pr__pfet_g5v0d16v0 mvpfet *mvpdiff \ +# extdrain,*mvpsd nwell error l=l w=w a1=as p1=ps a2=ad p2=pd # device msubcircuit sky130_fd_pr__nfet_20v0_nvt mvnnfet *mvndiff,mvndiffres \ # dnwell pwell,space/w error l=l w=w a1=as a2=ad p1=ps p2=pd # device msubcircuit sky130_fd_pr__nfet_20v0 mvnfet *mvndiff,mvndiffres \ @@ -5909,22 +6066,22 @@ variants (nowell) # pwell,space/w nwell error l=l w=w a1=as a2=ad p1=ps p2=pd device msubcircuit sky130_fd_pr__pfet_g5v0d10v5 mvpfet \ - *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ + *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_g5v0d10v5 mvnfet \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_05v0_nvt mvnnfet \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_03v3_nvt nnfet \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__esd_nfet_g5v0d10v5 mvnfetesd \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__esd_pfet_g5v0d10v5 mvpfetesd \ - *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ + *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device resistor sky130_fd_pr__res_generic_l1 rli1 *li,coreli @@ -5937,40 +6094,40 @@ variants (nowell) # photo pwell,space/w error a=area device rsubcircuit sky130_fd_pr__res_high_po xhrpoly \ - xpc l=l w=w + xpc l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_high_po_0p35 xhrpoly \ - xpc w>0.34 w<0.36 l=l + xpc w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_0p69 xhrpoly \ - xpc w>0.68 w<0.70 l=l + xpc w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_1p41 xhrpoly \ - xpc w>1.40 w<1.42 l=l + xpc w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_2p85 xhrpoly \ - xpc w>2.84 w<2.86 l=l + xpc w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_5p73 xhrpoly \ - xpc w>5.72 w<5.74 l=l + xpc w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po uhrpoly \ - xpc l=l w=w + xpc l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_xhigh_po_0p35 uhrpoly \ - xpc w>0.34 w<0.36 l=l + xpc w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_0p69 uhrpoly \ - xpc w>0.68 w<0.70 l=l + xpc w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_1p41 uhrpoly \ - xpc w>1.40 w<1.42 l=l + xpc w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_2p85 uhrpoly \ - xpc w>2.84 w<2.86 l=l + xpc w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_5p73 uhrpoly \ - xpc w>5.72 w<5.74 l=l + xpc w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_generic_nd ndiffres \ - *ndiff l=l w=w + *ndiff l=l w=w device rsubcircuit sky130_fd_pr__res_generic_pd pdiffres \ - *pdiff l=l w=w + *pdiff l=l w=w # device rsubcircuit sky130_fd_pr__res_iso_pw rpw \ # pwell dnwell error l=l w=w device rsubcircuit sky130_fd_pr__res_generic_nd__hv mvndiffres \ - *mvndiff l=l w=w + *mvndiff l=l w=w device rsubcircuit sky130_fd_pr__res_generic_pd__hv mvpdiffres \ - *mvpdiff l=l w=w + *mvpdiff l=l w=w device resistor sky130_fd_pr__res_generic_po rmp *poly device resistor sky130_fd_pr__res_generic_po mrp1 *poly @@ -5980,7 +6137,7 @@ variants (nowell) # device pdiode sky130_fd_pr__diode_pd2nw_05v5_lvt *pdiodelvt nwell a=area*1E12 p=pj*1E6 # device pdiode sky130_fd_pr__diode_pd2nw_05v5_hvt *pdiodehvt nwell a=area*1E12 p=pj*1E6 # device pdiode sky130_fd_pr__diode_pd2nw_11v0 *mvpdiode nwell a=area*1E12 p=pj*1E6 -# + # device ndiode sky130_fd_pr__diode_pw2nd_05v5 *ndiode pwell,space/w a=area*1E12 p=pj*1E6 # device ndiode sky130_fd_pr__diode_pw2nd_05v5_lvt *ndiodelvt pwell,space/w a=area*1E12 p=pj*1E6 # device ndiode sky130_fd_pr__diode_pw2nd_05v5_nvt *nndiode pwell,space/w a=area*1E12 p=pj*1E6 @@ -6035,17 +6192,7 @@ variants (nowell) device resistor sky130_fd_pr__res_generic_m4 rm4 *m4 device resistor sky130_fd_pr__res_generic_m5 rm5 *m5 - device resistor sky130_fd_pr__res_high_po_0p35 xhrpoly xpc +res0p35 - device resistor sky130_fd_pr__res_high_po_0p69 xhrpoly xpc +res0p69 - device resistor sky130_fd_pr__res_high_po_1p41 xhrpoly xpc +res1p41 - device resistor sky130_fd_pr__res_high_po_2p85 xhrpoly xpc +res2p85 - device resistor sky130_fd_pr__res_high_po_5p73 xhrpoly xpc +res5p73 device resistor sky130_fd_pr__res_high_po xhrpoly xpc - device resistor sky130_fd_pr__res_xhigh_po_0p35 uhrpoly xpc +res0p35 - device resistor sky130_fd_pr__res_xhigh_po_0p69 uhrpoly xpc +res0p69 - device resistor sky130_fd_pr__res_xhigh_po_1p41 uhrpoly xpc +res1p41 - device resistor sky130_fd_pr__res_xhigh_po_2p85 uhrpoly xpc +res2p85 - device resistor sky130_fd_pr__res_xhigh_po_5p73 uhrpoly xpc +res5p73 device resistor sky130_fd_pr__res_xhigh_po uhrpoly xpc device resistor sky130_fd_pr__res_generic_po mrp1 *poly device resistor sky130_fd_pr__res_generic_nd ndiffres *ndiff diff --git a/checks/be_checks/tech/sky130A/sky130A_setup.tcl b/checks/be_checks/tech/sky130A/sky130A_setup.tcl index cd69939..75a6329 100644 --- a/checks/be_checks/tech/sky130A/sky130A_setup.tcl +++ b/checks/be_checks/tech/sky130A/sky130A_setup.tcl @@ -163,10 +163,11 @@ lappend devices sky130_fd_pr__pfet_01v8_lvt lappend devices sky130_fd_pr__pfet_01v8_mvt lappend devices sky130_fd_pr__pfet_01v8_hvt lappend devices sky130_fd_pr__pfet_g5v0d10v5 -lappend devices sky130_fd_pr__special_pfet_pass -lappend devices sky130_fd_pr__special_pfet_latch -lappend devices sky130_fd_pr__special_nfet_pass lappend devices sky130_fd_pr__special_nfet_latch +lappend devices sky130_fd_pr__special_nfet_pass +lappend devices sky130_fd_pr__special_pfet_latch +lappend devices sky130_fd_pr__special_nfet_01v8 +lappend devices sky130_fd_pr__special_pfet_01v8_hvt lappend devices sky130_fd_pr__cap_var_lvt lappend devices sky130_fd_pr__cap_var_hvt lappend devices sky130_fd_pr__cap_var diff --git a/checks/be_checks/tech/sky130B/cvc.models b/checks/be_checks/tech/sky130B/cvc.models index 9b638b5..fd20831 100644 --- a/checks/be_checks/tech/sky130B/cvc.models +++ b/checks/be_checks/tech/sky130B/cvc.models @@ -45,9 +45,11 @@ R sky130_fd_pr__res_high_po_1p41 R=l/1.41*300 R sky130_fd_pr__res_high_po_2p85 R=l/2.85*300 R sky130_fd_pr__res_high_po_5p73 R=l/5.73*300 R sky130_fd_pr__res_iso_pw R=l/w*4400 +R sky130_fd_pr_reram__reram_cell R=10 R sky130_fd_pr__reram_reram_cell R=10 MN sky130_fd_pr__nfet_01v8 Vth=0.2 Vgs=1.8 Vds=1.8 +MN sky130_fd_pr__special_nfet_01v8 Vth=0.2 Vgs=1.8 Vds=1.8 MN sky130_fd_pr__nfet_01v8_lvt Vth=0.1 Vgs=1.8 Vds=1.8 MN sky130_fd_pr__special_nfet_latch Vth=0.2 Vgs=1.8 Vds=1.8 MN sky130_fd_pr__special_nfet_pass Vth=0.2 Vgs=1.8 Vds=1.8 @@ -60,6 +62,7 @@ MN sky130_fd_bs_flash__special_sonosfet_star Vth=0.2 MP sky130_fd_pr__pfet_01v8 Vth=-0.2 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__pfet_01v8_lvt Vth=-0.1 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__pfet_01v8_hvt Vth=-0.3 Vgs=1.8 Vds=1.8 +MP sky130_fd_pr__special_pfet_01v8_hvt Vth=-0.3 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__special_pfet_pass Vth=-0.2 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__special_pfet_latch Vth=-0.2 Vgs=1.8 Vds=1.8 MP sky130_fd_pr__pfet_g5v0d10v5 Vth=-0.2 diff --git a/checks/be_checks/tech/sky130B/known_abstract_filter.awk b/checks/be_checks/tech/sky130B/known_abstract_filter.awk index f832f60..3652cba 100644 --- a/checks/be_checks/tech/sky130B/known_abstract_filter.awk +++ b/checks/be_checks/tech/sky130B/known_abstract_filter.awk @@ -2,4 +2,5 @@ /__tapvpwrvgnd_/ {next} /__fakediode_/ {next} /sky130_fd_pr__/ {next} # ignore primitive devices +/sky130_fd_pr_reram__/ {next} # ignore primitive reram devices { print } diff --git a/checks/be_checks/tech/sky130B/lvs_config.caravel_core.json b/checks/be_checks/tech/sky130B/lvs_config.caravel_core.json index f079e87..67b7780 100644 --- a/checks/be_checks/tech/sky130B/lvs_config.caravel_core.json +++ b/checks/be_checks/tech/sky130B/lvs_config.caravel_core.json @@ -12,6 +12,9 @@ "EXTRACT_ABSTRACT": [ "" ], + "EXTRACT_CREATE_SUBCUT": [ + "*user_project_wrapper" + ], "LVS_FLATTEN": [ "" ], diff --git a/checks/be_checks/tech/sky130B/lvs_config.chip_io.json b/checks/be_checks/tech/sky130B/lvs_config.chip_io.json index 60f589c..77dd10a 100644 --- a/checks/be_checks/tech/sky130B/lvs_config.chip_io.json +++ b/checks/be_checks/tech/sky130B/lvs_config.chip_io.json @@ -6,11 +6,11 @@ "TOP_SOURCE": "chip_io", "TOP_LAYOUT": "$TOP_SOURCE", "EXTRACT_FLATGLOB": [ + "*_CDNS_*", "*sky130_fd_pr__*example*", "*sky130_ef_io__com*", "*sky130_ef_io__connect*", "*sky130_ef_io__corner*", - "*sky130_ef_io__gpiov2_pad", "*sky130_ef_io__*_overlay", "*sky130_fd_io__amux*", "*sky130_fd_io__amx_inv1", @@ -55,7 +55,7 @@ "" ], "LVS_SPICE_FILES": [ - "$PDK_ROOT/$PDK/libs.ref/sky130_fd_io/spice/*.spice" + "$LVS_ROOT/spice/sky130_*_io.1_0_410+.spice" ], "LVS_VERILOG_FILES": [ "$CARAVEL_ROOT/verilog/gl/constant_block.v", diff --git a/checks/be_checks/tech/sky130B/remove_well.sed b/checks/be_checks/tech/sky130B/remove_well.sed index 5706283..8e3dc11 100644 --- a/checks/be_checks/tech/sky130B/remove_well.sed +++ b/checks/be_checks/tech/sky130B/remove_well.sed @@ -5,16 +5,17 @@ s/[^ ]* \(sky130_fd_pr__res_high_po\)/\1/ s/[^ ]* \(sky130_fd_pr__res_xhigh_po\)/\1/ s/[^ ]* \(sky130_fd_pr__res_generic_nd\)/\1/ s/[^ ]* \(sky130_fd_pr__res_generic_pd\)/\1/ -s/[^ ]* \(sky130_fd_pr__cap_var_lvt\)/\1/ +s/[^ ]* \(sky130_fd_pr__cap_var\)/\1/ s/[^ ]* \(sky130_fd_bs_flash__special_sonosfet_star\)/\1/ s/[^ ]* \(ppolyf_u_1k_6p0\)/\1/ s/[^ ]* \(ppolyf_u\)/\1/ s/[^ ]* \(.fet_06v0\)/\1/ /^D.* sky130_fd_pr__diode_pd2nw_/d /^D.* sky130_fd_pr__diode_pw2nd_/d +/^D.* sky130_fd_pr__model__parasitic__diode_ps2dn/d /^D.* diode_pd2nw_06v0/d /^D.* diode_nd2ps_06v0/d /^D.* np_6p0/d /^D.* pn_6p0/d -/^R.* sky130_fd_pr__res_iso_pw/d +/^[RX].* sky130_fd_pr__res_iso_pw/d /^X.* sky130_fd_pr__pnp_05v5/d diff --git a/checks/be_checks/tech/sky130B/sky130B.tech b/checks/be_checks/tech/sky130B/sky130B.tech index 4e8310c..367c733 100644 --- a/checks/be_checks/tech/sky130B/sky130B.tech +++ b/checks/be_checks/tech/sky130B/sky130B.tech @@ -14,7 +14,7 @@ tech end version - version 1.0.446-0-gdd7771c + version 1.0.470-0-g6d4d117 description "SkyWater SKY130: Open Source rules and DRC" requires magic-8.3.411 end @@ -50,7 +50,9 @@ end # sky130_fd_pr__nfet_03v3_nvt nnfet native nFET # sky130_fd_pr__pfet_g5v0d10v5 mvpfet thickox pFET # sky130_fd_pr__nfet_g5v0d10v5 mvnfet thickox nFET -# sky130_fd_pr__nfet_01v8_nvt mvnnfet thickox native nFET +# sky130_fd_pr__nfet_05v0_nvt mvnnfet thickox native nFET +# sky130_fd_pr__nfet_g5v0d16v0 mvnfet extended-drain nFET*** +# sky130_fd_pr__pfet_g5v0d16v0 mvpfet extended-drain pFET*** # sky130_fd_pr__diode_pw2nd_05v5 ndiode n+ diff diode # sky130_fd_pr__diode_pw2nd_05v5_lvt ndiodelvt low Vt n+ diff diode # sky130_fd_pr__diode_pw2nd_05v5_nvt nndiode diode with nndiff @@ -88,6 +90,10 @@ end # outside of the standard cell except for the DRC rule for # FET to diffusion contact spacing (which is 0.05um, not 0.055um) # +# (***) The extended-drain devices have the same identifying +# FET type as the thick oxide devices, but the drain side of the +# device is represented by layer extdrain extending to nsd or psd. +# #------------------------------------------------------------- # The following devices are not extracted but are represented # only by script-generated subcells in the PDK. @@ -186,6 +192,7 @@ types active nsubdiffcont,nsubstratencontact,nsc,ntapc active mvpsubdiffcont,mvpsubstratepcontact,mvpsc,mvptapc active mvnsubdiffcont,mvnsubstratencontact,mvnsc,mvntapc + active extdrain,ed -active obsactive -active mvobsactive @@ -237,7 +244,6 @@ types metal1 rmetal1,rm1,rmet1 metal1 via1,m2contact,m2cut,m2c,via,v,v1 -metal1 obsm1 - metal1 padl -metal1 m1fill metal2 reram,rr @@ -327,8 +333,6 @@ contact mimcc mimcap metal4 mim2cc mimcap2 metal5 - padl m1 m2 m3 m4 m5 glass - mrdlc metal5 mrdl pi2 mrdl ubm end @@ -413,8 +417,6 @@ aliases allm4 *m4,rm4 allm5 *m5,rm5 - allpad padl - psub pwell obstypes obswell,mvobsactive,obsactive,obsli,obsmcon,obsm1,obsm2,obsm3,obsm4,obsm5,obsmrdl,obscomment @@ -481,6 +483,8 @@ styles mvnsc ndiff_in_nwell metal1 contact_X'es hvndiff_mask mvpsc pdiff_in_pwell metal1 contact_X'es hvpdiff_mask + extdrain nselect pselect + poly polysilicon polyfill polysilicon pc polysilicon metal1 contact_X'es @@ -571,8 +575,6 @@ styles obswell cwell obsactive implant4 - padl metal6 via6 overglass - magnet substrate_field_implant rotate via3alt fence via5 @@ -666,6 +668,8 @@ end connect *nwell,*nsd,*mvnsd,dnwell,pnp,photo *nwell,*nsd,*mvnsd,dnwell,pnp,photo pwell,*psd,*mvpsd,npn,isosub pwell,*psd,*mvpsd,npn,isosub + *mvnsd ed + *mvpsd ed *li,coreli,lifill *li,coreli,lifill *m1,m1fill,obsmcon *m1,m1fill,obsmcon *m2,m2fill,reram *m2,m2fill,reram @@ -677,7 +681,7 @@ connect allnactivenonfet allnactivenonfet allpactivenonfet allpactivenonfet *poly,xpc,allfets,polyfill *poly,xpc,allfets,polyfill - # RDL connects to m5 (i.e., padl) through glass cut + # RDL connects to m5 through glass cut *mrdl *mrdl glass metrdl end @@ -734,9 +738,34 @@ style gdsii # NWELL #---------------------------------------------------------------- + # Identify LDMOS drain areas + templayer ndrainarea + bloat-all ed *mvnsd + and-not ed + + templayer pdrainarea + bloat-all ed *mvpsd + and-not ed + + # Generate n-well under extended-drain nFET + templayer extnwell + bloat-or *mvnsd * 0 extdrain 1150 + and-not *mvnsd + or ndrainarea + grow 660 + + # Erase n-well under extended-drain pFET + templayer extpwell + bloat-or *mvpsd * 0 extdrain 590 + and-not *mvpsd + or pdrainarea + grow 860 + layer NWELL allnwell bloat-all rpw dnwell and-not rpw,pwell + or extnwell + and-not extpwell calma 64 20 layer WELLTXT @@ -763,7 +792,13 @@ style gdsii # DIFF #---------------------------------------------------------------- + # Extended-drain FETs cut the diffusion under the gate + templayer ldbreak + bloat-or *mvnsd * 0 extdrain 1585 + bloat-or *mvpsd * 0 extdrain 1190 + layer DIFF allnactivenontap,allpactivenontap,allactiveres + and-not ldbreak calma 65 20 layer DIFFTXT @@ -832,6 +867,15 @@ style gdsii mask-hints NSDM calma 93 44 +#---------------------------------------------------------------- +# EDID (Extended drain identifier) +#---------------------------------------------------------------- + + layer EDID + bloat-all extdrain *mvnsd,*mvpsd,mvnfet,mvpfet,*mvndiff,*mvpdiff + labels extdrain + calma 81 57 + #---------------------------------------------------------------- # LVID #---------------------------------------------------------------- @@ -1018,7 +1062,9 @@ style gdsii # HVI (includes rules NWELL 8-11 and DIFFTAP 14-26) #---------------------------------------------------------------- - templayer thkox_area alldiffmv,mvvar + templayer thkox_area ed + grow 475 + or alldiffmv,mvvar grow 185 bloat-all alldiffmv nwell grow 345 @@ -1113,7 +1159,7 @@ style gdsii # POLYRES extends to edge of contact cut layer POLYRES xhrpoly,uhrpoly - grow 60 + grow 80 and xpc or xhrpoly,uhrpoly calma 66 13 @@ -1314,7 +1360,7 @@ style gdsii calma 74 16 layer PI1 *metrdl - and padl,glass + and m5,glass # Test only---needs GDS layer number layer UBM *metrdl @@ -1950,7 +1996,7 @@ style wafflefill variants (),(tiled) # diff or poly. #--------------------------------------------------------- - templayer obstruct_li_coarse allli,allpad,obsli,lifill,fillblock,fillblock4 + templayer obstruct_li_coarse allli,obsli,lifill,fillblock,fillblock4 grow 2800 or alldiff,allpoly grow 200 @@ -1962,7 +2008,7 @@ style wafflefill variants (),(tiled) shrink 1495 grow 1495 - templayer obstruct_li_medium allli,allpad,obsli,lifill,fillblock,fillblock4 + templayer obstruct_li_medium allli,obsli,lifill,fillblock,fillblock4 grow 2500 or lifill_coarse grow 300 @@ -1975,7 +2021,7 @@ style wafflefill variants (),(tiled) shrink 745 grow 745 - templayer obstruct_li_fine allli,allpad,obsli,lifill,fillblock,fillblock4 + templayer obstruct_li_fine allli,obsli,lifill,fillblock,fillblock4 or lifill_coarse,lifill_medium grow 300 or alldiff,allpoly @@ -1996,7 +2042,7 @@ style wafflefill variants (),(tiled) # MET1 fill #--------------------------------------------------- - templayer obstruct_m1_coarse allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_coarse allm1,obsm1,m1fill,fillblock,fillblock4 grow 3000 templayer met1fill_coarse topbox # slots 0 2000 200 0 2000 200 700 0 @@ -2006,7 +2052,7 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m1_medium allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_medium allm1,obsm1,m1fill,fillblock,fillblock4 grow 2800 or met1fill_coarse grow 200 @@ -2017,7 +2063,7 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m1_fine allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_fine allm1,obsm1,m1fill,fillblock,fillblock4 grow 300 or met1fill_coarse,met1fill_medium grow 200 @@ -2028,7 +2074,7 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m1_veryfine allm1,allpad,obsm1,m1fill,fillblock,fillblock4 + templayer obstruct_m1_veryfine allm1,obsm1,m1fill,fillblock,fillblock4 grow 100 or met1fill_coarse,met1fill_medium,met1fill_fine grow 200 @@ -2048,7 +2094,7 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET2 fill #--------------------------------------------------- - templayer obstruct_m2 allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2 allm2,obsm2,m2fill,fillblock,fillblock4 grow 3000 templayer met2fill_coarse topbox # slots 0 2000 200 0 2000 200 700 350 @@ -2058,7 +2104,7 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m2_medium allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2_medium allm2,obsm2,m2fill,fillblock,fillblock4 grow 2800 or met2fill_coarse grow 200 @@ -2069,7 +2115,7 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m2_fine allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2_fine allm2,obsm2,m2fill,fillblock,fillblock4 grow 300 or met2fill_coarse,met2fill_medium grow 200 @@ -2080,7 +2126,7 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m2_veryfine allm2,allpad,obsm2,m2fill,fillblock,fillblock4 + templayer obstruct_m2_veryfine allm2,obsm2,m2fill,fillblock,fillblock4 grow 100 or met2fill_coarse,met2fill_medium,met2fill_fine grow 200 @@ -2100,7 +2146,7 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET3 fill #--------------------------------------------------- - templayer obstruct_m3 allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3 allm3,glass,obsm3,m3fill,fillblock,fillblock4 grow 3000 templayer met3fill_coarse topbox # slots 0 2000 300 0 2000 300 700 700 @@ -2110,7 +2156,7 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m3_medium allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3_medium allm3,glass,obsm3,m3fill,fillblock,fillblock4 grow 2700 or met3fill_coarse grow 300 @@ -2121,7 +2167,7 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m3_fine allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3_fine allm3,glass,obsm3,m3fill,fillblock,fillblock4 grow 200 or met3fill_coarse,met3fill_medium grow 300 @@ -2132,7 +2178,7 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m3_veryfine allm3,allpad,obsm3,m3fill,fillblock,fillblock4 + templayer obstruct_m3_veryfine allm3,glass,obsm3,m3fill,fillblock,fillblock4 # Note: Adding 0.1 to waffle rule to clear wide spacing rule grow 100 or met3fill_coarse,met3fill_medium,met3fill_fine @@ -2153,7 +2199,9 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET4 fill #--------------------------------------------------- - templayer obstruct_m4 allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4 glass + grow 2500 + or allm4,obsm4,m4fill,fillblock,fillblock4 grow 3000 templayer met4fill_coarse topbox # slots 0 2000 300 0 2000 300 700 1050 @@ -2163,7 +2211,9 @@ style wafflefill variants (),(tiled) shrink 995 grow 995 - templayer obstruct_m4_medium allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4_medium glass + grow 2500 + or allm4,obsm4,m4fill,fillblock,fillblock4 grow 2700 or met4fill_coarse grow 300 @@ -2174,7 +2224,9 @@ style wafflefill variants (),(tiled) shrink 495 grow 495 - templayer obstruct_m4_fine allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4_fine glass + grow 5000 + or allm4,obsm4,m4fill,fillblock,fillblock4 grow 200 or met4fill_coarse,met4fill_medium grow 300 @@ -2185,7 +2237,9 @@ style wafflefill variants (),(tiled) shrink 285 grow 285 - templayer obstruct_m4_veryfine allm4,allpad,obsm4,m4fill,fillblock,fillblock4 + templayer obstruct_m4_veryfine glass + grow 5100 + or allm4,obsm4,m4fill,fillblock,fillblock4 # Note: Adding 0.1 to waffle rule to clear wide spacing rule grow 100 or met4fill_coarse,met4fill_medium,met4fill_fine @@ -2206,7 +2260,7 @@ style wafflefill variants (),(tiled) #--------------------------------------------------- # MET5 fill #--------------------------------------------------- - templayer obstruct_m5 allm5,allpad,obsm5,m5fill,fillblock + templayer obstruct_m5 allm5,glass,obsm5,m5fill,fillblock grow 3000 templayer met5fill_coarse topbox slots 0 5000 1600 0 5000 1600 1000 100 @@ -2215,7 +2269,7 @@ style wafflefill variants (),(tiled) shrink 2495 grow 2495 - templayer obstruct_m5_medium allm5,allpad,obsm5,m5fill,fillblock + templayer obstruct_m5_medium allm5,glass,obsm5,m5fill,fillblock grow 1400 or met5fill_coarse grow 1600 @@ -2230,6 +2284,27 @@ style wafflefill variants (),(tiled) or met5fill_medium calma 59 28 +style subcutout + # generates a new subcut layer from the cell boundary, with windows for existing subcut and dnwell + # should be used on a flattened layout + scalefactor 10 nanometers + options calma-permissive-labels + gridlimit 5 + + templayer CELLBOUND + boundary + + templayer large_dnwell dnwell + grow 10 + + templayer large_isosub isosub + grow 10 + + layer SUBCUT CELLBOUND + grow 10 + and-not large_dnwell + and-not large_isosub + calma 81 53 end #----------------------------------------------------------------------- @@ -2243,7 +2318,7 @@ style sky130 variants (),(vendor),(nowell) scalefactor 10 nanometers gridlimit 5 - options ignore-unknown-layer-labels no-reconnect-labels + options ignore-unknown-layer-labels ignore NPC ignore SEALID @@ -2253,6 +2328,7 @@ style sky130 variants (),(vendor),(nowell) ignore POLYMOD ignore LOWTAPDENSITY ignore FILLOBSPOLY + ignore FILLOBSFOM ignore MET5BLOCK ignore OUTLINE ignore POLYCUT @@ -2262,18 +2338,18 @@ style sky130 variants (),(vendor),(nowell) ignore PADDIFFID ignore PADMETALID ignore PADCENTERID -variants (nowell) - ignore DNWELL - ignore SUBCUT - ignore NWELL - ignore PWRES - ignore NPNID - ignore PNPID - ignore PHOTO - ignore SUBTXT - ignore WELLTXT - ignore SUBPIN - ignore WELLPIN +variants (nowell) + ignore DNWELL + ignore SUBCUT + ignore NWELL + ignore PWRES + ignore NPNID + ignore PNPID + ignore PHOTO + ignore SUBTXT + ignore WELLTXT + ignore SUBPIN + ignore WELLPIN variants (),(vendor) layer pnp NWELL,WELLTXT,WELLPIN @@ -2821,6 +2897,47 @@ variants * labels TAP labels TAPTXT text + # Fill in FET under extended drain + layer mvpfet EDID + and POLY + and-not DIFF + and-not TAP + and-not NWELL + + layer mvnfet EDID + and POLY + and-not DIFF + and-not TAP + and NWELL + + # Restrict where nwell is merged + templayer ldmos_nwell EDID + grow 1200 + and NWELL + + # Remove or add well under extended FET gate + layer nwell EDID + and POLY + and DIFF + and PSDM + grow 685 + or ldmos_nwell + grow 420 + shrink 420 + + layer pwell EDID + and POLY + and DIFF + and NSDM + grow 660 + grow 420 + shrink 420 + + layer ed EDID + and-not POLY + and-not DIFF + and-not TAP + templayer mvnsdexpand mvnsdarea grow 500 @@ -2927,8 +3044,8 @@ variants * templayer xpolyterm RPM,URPM and POLY and-not POLYRES - # add back the 0.06um contact surround in the direction of the resistor - grow 60 + # add back the 0.08um contact surround in the direction of the resistor + grow 80 and POLY layer xpc xpolyterm @@ -3742,8 +3859,6 @@ variants * and-not FILLOBSM5 labels FILLOBSM1,FILLOBSM2,FILLOBSM3,FILLOBSM4 - layer obsactive FILLOBSFOM - # MOS Varactor layer var POLY @@ -3791,6 +3906,8 @@ variants * calma PSDM 94 20 # HVI (THKOX) calma HVI 75 20 + # EDID + calma EDID 81 57 # NPC calma NPC 95 20 # P+ POLY MASK @@ -4096,6 +4213,15 @@ variants (fast),(full) edge4way (*pdiff)/a (*nsd)/a 400 ~(*pdiff)/a 0 0 "NSDM width < %d (diff/tap.5)" edge4way (*ndiff)/a (*psd)/a 400 ~(*ndiff)/a 0 0 "PSDM width < %d (diff/tap.5)" + # Extended drain rules + edge4way space/a ed/a 5000 ~(space)/a 0 0 "LDNFET/LDPFET width < %d (denmos/depmos.2)" + edge4way (*mvndiff)/a mvnfet 1055 ~(ed)/a 0 0 "LDNFET length < %d (denmos.1)" + edge4way (*mvnsd)/a ed/a 2510 ~(*mvndiff)/a 0 0 \ + "LDNFET drain to source < %d (denmos.6 + denmos.3)" + edge4way (*mvpdiff)/a mvpfet 1050 ~(ed)/a 0 0 "LDPFET length < %d (depmos.1)" + edge4way (*mvpsd)/a ed/a 2110 ~(*mvpdiff)/a 0 0 \ + "LDPFET drain to source < %d (depmos.6 + depmos.3)" + area *nsd,*mvnsd 70110 150 "N-tap minimum area < 0.07011um^2 (nsd.10b)" area *psd,*mvpsd 70110 150 "P-tap minimum area < 0.07011um^2 (psd.10b)" @@ -4195,6 +4321,17 @@ variants (fast),(full) ~(pfetlvt,nfetlvt,pdiodelvt,ndiodelvt)/a allfetsnolvt 415 \ "Min. spacing between FET and LVTN in S/D direction < %d (lvtn.3b)" +#-------------------------------------------------------------------- +# HVNTM +#-------------------------------------------------------------------- + +variants (full) + # This requires extra spacing of hvndiff if a ptap is in between + cifwidth hvntm_generate 700 "Width of HVNTM < %d (hvntm.1)" + cifspacing hvntm_generate hvntm_generate 700 touching_ok \ + "HVNTM spacing < %d (hvntm.2)" +variants * + #-------------------------------------------------------------------- # NPC (Nitride poly Cut) #-------------------------------------------------------------------- @@ -4538,7 +4675,7 @@ variants (full) width metrdl 10000 "RDL width < %d (rdl.1)" spacing metrdl metrdl 10000 touching_ok "RDL spacing < %d (rdl.2)" surround glass metrdl 10750 absence_ok "RDL must surround glass cut by %d (rdl.3)" - spacing padl metrdl 19660 surround_ok "RDL spacing to unrelated pad < %d (rdl.6)" + spacing glass metrdl 19660 surround_ok "RDL spacing to unrelated pad < %d (rdl.6)" variants (fast),(full) @@ -4874,7 +5011,7 @@ extract tiedown alldiffnonfet variants (),(orig),(si),(hrhc),(lrhc),(hrlc),(lrlc) - # for all variants except (nowell) + # for all variants except (nowell) substrate *ppdiff,*mvppdiff,space/w,pwell well $SUB -dnwell,isosub @@ -5735,12 +5872,18 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_hvt pfethvt,scpfethvt \ - *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *pdiff,pdiffres *pdiff,pdiffres nwell error w>=0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_pfet_01v8_hvt scpfethvt \ + *pdiff,pdiffres *pdiff,pdiffres nwell error w<0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_01v8 nfet,scnfet \ - *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error \ + w>=0.42 l=l w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_nfet_01v8 scnfet \ + *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error \ + w<0.42 l=l w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_latch npd \ *ndiff,ndiffres *ndiff,ndiffres pwell,space/w error l=l w=w \ a1=as p1=ps a2=ad p2=pd @@ -5784,6 +5927,10 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) device msubcircuit Ignore mvpfet *mvpdiff,mvpdiffres pwell,space/w nwell error +npn,pnp # Extended drain devices (must appear before the regular devices) + device msubcircuit sky130_fd_pr__nfet_g5v0d16v0 mvnfet *mvndiff \ + extdrain,*mvnsd pwell,space/w error l=l w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__pfet_g5v0d16v0 mvpfet *mvpdiff \ + extdrain,*mvpsd nwell error l=l w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_20v0_nvt mvnnfet *mvndiff,mvndiffres \ dnwell pwell,space/w error l=l w=w a1=as a2=ad p1=ps p2=pd device msubcircuit sky130_fd_pr__nfet_20v0 mvnfet *mvndiff,mvndiffres \ @@ -5820,29 +5967,29 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) photo pwell,space/w error a=area device rsubcircuit sky130_fd_pr__res_high_po xhrpoly \ - xpc nwell,pwell,space/w error l=l w=w + xpc nwell,pwell,space/w error l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_high_po_0p35 xhrpoly \ - xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l + xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_0p69 xhrpoly \ - xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l + xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_1p41 xhrpoly \ - xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l + xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_2p85 xhrpoly \ - xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l + xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_5p73 xhrpoly \ - xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l + xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po uhrpoly \ - xpc nwell,pwell,space/w error l=l w=w + xpc nwell,pwell,space/w error l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_xhigh_po_0p35 uhrpoly \ - xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l + xpc nwell,pwell,space/w error w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_0p69 uhrpoly \ - xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l + xpc nwell,pwell,space/w error w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_1p41 uhrpoly \ - xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l + xpc nwell,pwell,space/w error w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_2p85 uhrpoly \ - xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l + xpc nwell,pwell,space/w error w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_5p73 uhrpoly \ - xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l + xpc nwell,pwell,space/w error w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_generic_nd ndiffres \ *ndiff pwell,space/w error l=l w=w @@ -5869,7 +6016,7 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) device ndiode sky130_fd_pr__diode_pw2nd_05v5_nvt *nndiode pwell,space/w a=area*1E12 p=pj*1E6 device ndiode sky130_fd_pr__diode_pw2nd_11v0 *mvndiode pwell,space/w a=area*1E12 p=pj*1E6 - device csubcircuit sky130_fd_pr__reram_reram_cell reram m1 a=area_ox + device csubcircuit sky130_fd_pr_reram__reram_cell reram m1 a=area_ox device csubcircuit sky130_fd_pr__cap_mim_m3_1 *mimcap *m3 w=w l=l device csubcircuit sky130_fd_pr__cap_mim_m3_2 *mimcap2 *m4 w=w l=l @@ -5877,45 +6024,51 @@ variants (),(si),(hrhc),(lrhc),(hrlc),(lrlc) variants (nowell) device msubcircuit sky130_fd_pr__pfet_01v8 pfet,scpfet \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_pfet_latch ppu \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_lvt pfetlvt \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_mvt pfetmvt \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ + *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__pfet_01v8_hvt pfethvt,scpfethvt \ - *pdiff,pdiffres *pdiff,pdiffres l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *pdiff,pdiffres *pdiff,pdiffres w>=0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_pfet_01v8_hvt scpfethvt \ + *pdiff,pdiffres *pdiff,pdiffres w<0.42 l=l \ + w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_01v8 nfet,scnfet \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ - a1=as p1=ps a2=ad p2=pd + *ndiff,ndiffres *ndiff,ndiffres \ + w>=0.42 l=l w=w a1=as p1=ps a2=ad p2=pd + device msubcircuit sky130_fd_pr__special_nfet_01v8 scnfet \ + *ndiff,ndiffres *ndiff,ndiffres \ + w<0.42 l=l w=w a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_latch npd \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_latch npd \ - *ndiff,ndiffres *srampvar l=l w=w \ + *ndiff,ndiffres *srampvar l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__special_nfet_pass npass \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_01v8_lvt nfetlvt \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_bs_flash__special_sonosfet_star nsonos \ - *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ + *ndiff,ndiffres *ndiff,ndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device subcircuit sky130_fd_pr__cap_var_lvt varactor \ - *nndiff l=l w=w + *nndiff l=l w=w device subcircuit sky130_fd_pr__cap_var_hvt varhvt \ - *nndiff l=l w=w + *nndiff l=l w=w device subcircuit sky130_fd_pr__cap_var mvvaractor \ - *mvnndiff l=l w=w + *mvnndiff l=l w=w # Bipolars # device msubcircuit sky130_fd_pr__npn_05v5 npn *ndiff dnwell space/w error a1=area @@ -5931,13 +6084,17 @@ variants (nowell) # device msubcircuit sky130_fd_pr__npn_11v0 npn *mvndiff dnwell space/w error a1=area # device msubcircuit sky130_fd_pr__npn_11v0_W1p00L1p00 npn *mvndiff \ # dnwell space/w error a1>0.99 a1<1.01 -# + # Ignore the extended-drain FET geometry that forms part of the high-voltage # bipolar devices. # device msubcircuit Ignore mvnfet *mvndiff,mvndiffres dnwell pwell,space/w error +npn,pnp # device msubcircuit Ignore mvpfet *mvpdiff,mvpdiffres pwell,space/w nwell error +npn,pnp # Extended drain devices (must appear before the regular devices) +# device msubcircuit sky130_fd_pr__nfet_g5v0d16v0 mvnfet *mvndiff \ +# extdrain,*mvnsd pwell,space/w error l=l w=w a1=as p1=ps a2=ad p2=pd +# device msubcircuit sky130_fd_pr__pfet_g5v0d16v0 mvpfet *mvpdiff \ +# extdrain,*mvpsd nwell error l=l w=w a1=as p1=ps a2=ad p2=pd # device msubcircuit sky130_fd_pr__nfet_20v0_nvt mvnnfet *mvndiff,mvndiffres \ # dnwell pwell,space/w error l=l w=w a1=as a2=ad p1=ps p2=pd # device msubcircuit sky130_fd_pr__nfet_20v0 mvnfet *mvndiff,mvndiffres \ @@ -5946,22 +6103,22 @@ variants (nowell) # pwell,space/w nwell error l=l w=w a1=as a2=ad p1=ps p2=pd device msubcircuit sky130_fd_pr__pfet_g5v0d10v5 mvpfet \ - *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ + *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_g5v0d10v5 mvnfet \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_05v0_nvt mvnnfet \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__nfet_03v3_nvt nnfet \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__esd_nfet_g5v0d10v5 mvnfetesd \ - *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ + *mvndiff,mvndiffres *mvndiff,mvndiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device msubcircuit sky130_fd_pr__esd_pfet_g5v0d10v5 mvpfetesd \ - *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ + *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres l=l w=w \ a1=as p1=ps a2=ad p2=pd device resistor sky130_fd_pr__res_generic_l1 rli1 *li,coreli @@ -5974,40 +6131,40 @@ variants (nowell) # photo pwell,space/w error a=area device rsubcircuit sky130_fd_pr__res_high_po xhrpoly \ - xpc l=l w=w + xpc l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_high_po_0p35 xhrpoly \ - xpc w>0.34 w<0.36 l=l + xpc w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_0p69 xhrpoly \ - xpc w>0.68 w<0.70 l=l + xpc w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_1p41 xhrpoly \ - xpc w>1.40 w<1.42 l=l + xpc w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_2p85 xhrpoly \ - xpc w>2.84 w<2.86 l=l + xpc w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_high_po_5p73 xhrpoly \ - xpc w>5.72 w<5.74 l=l + xpc w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po uhrpoly \ - xpc l=l w=w + xpc l=l+0.16 w=w device rsubcircuit sky130_fd_pr__res_xhigh_po_0p35 uhrpoly \ - xpc w>0.34 w<0.36 l=l + xpc w>0.34 w<0.36 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_0p69 uhrpoly \ - xpc w>0.68 w<0.70 l=l + xpc w>0.68 w<0.70 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_1p41 uhrpoly \ - xpc w>1.40 w<1.42 l=l + xpc w>1.40 w<1.42 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_2p85 uhrpoly \ - xpc w>2.84 w<2.86 l=l + xpc w>2.84 w<2.86 l=l+0.16 device rsubcircuit sky130_fd_pr__res_xhigh_po_5p73 uhrpoly \ - xpc w>5.72 w<5.74 l=l + xpc w>5.72 w<5.74 l=l+0.16 device rsubcircuit sky130_fd_pr__res_generic_nd ndiffres \ - *ndiff l=l w=w + *ndiff l=l w=w device rsubcircuit sky130_fd_pr__res_generic_pd pdiffres \ - *pdiff l=l w=w + *pdiff l=l w=w # device rsubcircuit sky130_fd_pr__res_iso_pw rpw \ # pwell dnwell error l=l w=w device rsubcircuit sky130_fd_pr__res_generic_nd__hv mvndiffres \ - *mvndiff l=l w=w + *mvndiff l=l w=w device rsubcircuit sky130_fd_pr__res_generic_pd__hv mvpdiffres \ - *mvpdiff l=l w=w + *mvpdiff l=l w=w device resistor sky130_fd_pr__res_generic_po rmp *poly device resistor sky130_fd_pr__res_generic_po mrp1 *poly @@ -6017,13 +6174,13 @@ variants (nowell) # device pdiode sky130_fd_pr__diode_pd2nw_05v5_lvt *pdiodelvt nwell a=area*1E12 p=pj*1E6 # device pdiode sky130_fd_pr__diode_pd2nw_05v5_hvt *pdiodehvt nwell a=area*1E12 p=pj*1E6 # device pdiode sky130_fd_pr__diode_pd2nw_11v0 *mvpdiode nwell a=area*1E12 p=pj*1E6 -# + # device ndiode sky130_fd_pr__diode_pw2nd_05v5 *ndiode pwell,space/w a=area*1E12 p=pj*1E6 # device ndiode sky130_fd_pr__diode_pw2nd_05v5_lvt *ndiodelvt pwell,space/w a=area*1E12 p=pj*1E6 # device ndiode sky130_fd_pr__diode_pw2nd_05v5_nvt *nndiode pwell,space/w a=area*1E12 p=pj*1E6 # device ndiode sky130_fd_pr__diode_pw2nd_11v0 *mvndiode pwell,space/w a=area*1E12 p=pj*1E6 - device csubcircuit sky130_fd_pr__reram_reram_cell reram m1 a=area_ox + device csubcircuit sky130_fd_pr_reram__reram_cell reram m1 a=area_ox device csubcircuit sky130_fd_pr__cap_mim_m3_1 *mimcap *m3 w=w l=l device csubcircuit sky130_fd_pr__cap_mim_m3_2 *mimcap2 *m4 w=w l=l @@ -6073,17 +6230,7 @@ variants (nowell) device resistor sky130_fd_pr__res_generic_m4 rm4 *m4 device resistor sky130_fd_pr__res_generic_m5 rm5 *m5 - device resistor sky130_fd_pr__res_high_po_0p35 xhrpoly xpc +res0p35 - device resistor sky130_fd_pr__res_high_po_0p69 xhrpoly xpc +res0p69 - device resistor sky130_fd_pr__res_high_po_1p41 xhrpoly xpc +res1p41 - device resistor sky130_fd_pr__res_high_po_2p85 xhrpoly xpc +res2p85 - device resistor sky130_fd_pr__res_high_po_5p73 xhrpoly xpc +res5p73 device resistor sky130_fd_pr__res_high_po xhrpoly xpc - device resistor sky130_fd_pr__res_xhigh_po_0p35 uhrpoly xpc +res0p35 - device resistor sky130_fd_pr__res_xhigh_po_0p69 uhrpoly xpc +res0p69 - device resistor sky130_fd_pr__res_xhigh_po_1p41 uhrpoly xpc +res1p41 - device resistor sky130_fd_pr__res_xhigh_po_2p85 uhrpoly xpc +res2p85 - device resistor sky130_fd_pr__res_xhigh_po_5p73 uhrpoly xpc +res5p73 device resistor sky130_fd_pr__res_xhigh_po uhrpoly xpc device resistor sky130_fd_pr__res_generic_po mrp1 *poly device resistor sky130_fd_pr__res_generic_nd ndiffres *ndiff diff --git a/checks/be_checks/tech/sky130B/sky130B_setup.tcl b/checks/be_checks/tech/sky130B/sky130B_setup.tcl index 9f6387d..90eecdb 100644 --- a/checks/be_checks/tech/sky130B/sky130B_setup.tcl +++ b/checks/be_checks/tech/sky130B/sky130B_setup.tcl @@ -163,10 +163,11 @@ lappend devices sky130_fd_pr__pfet_01v8_lvt lappend devices sky130_fd_pr__pfet_01v8_mvt lappend devices sky130_fd_pr__pfet_01v8_hvt lappend devices sky130_fd_pr__pfet_g5v0d10v5 -lappend devices sky130_fd_pr__special_pfet_pass -lappend devices sky130_fd_pr__special_pfet_latch -lappend devices sky130_fd_pr__special_nfet_pass lappend devices sky130_fd_pr__special_nfet_latch +lappend devices sky130_fd_pr__special_nfet_pass +lappend devices sky130_fd_pr__special_pfet_latch +lappend devices sky130_fd_pr__special_nfet_01v8 +lappend devices sky130_fd_pr__special_pfet_01v8_hvt lappend devices sky130_fd_pr__cap_var_lvt lappend devices sky130_fd_pr__cap_var_hvt lappend devices sky130_fd_pr__cap_var @@ -370,6 +371,21 @@ foreach dev $devices { } } +#--------------------------------------------------------------- +# ReRAM +#--------------------------------------------------------------- + +set devices {sky130_fd_pr_reram__reram_cell} + +foreach dev $devices { + if {[lsearch $cells1 $dev] >= 0} { + property "-circuit1 $dev" delete Tfilament_0 + } + if {[lsearch $cells2 $dev] >= 0} { + property "-circuit2 $dev" delete Tfilament_0 + } +} + #--------------------------------------------------------------- # Schematic cells which are not extractable #--------------------------------------------------------------- @@ -391,7 +407,6 @@ foreach dev $devices { #--------------------------------------------------------------- # e.g., ignore class "-circuit2 sky130_fc_sc_hd__decap_3" #--------------------------------------------------------------- -#Added programatically. #--------------------------------------------------------------- # Allow the fill, decap, etc., cells to be parallelized @@ -536,3 +551,5 @@ foreach cell $cells1 { } } } + +#Added programatically. diff --git a/checks/be_checks/tech/sky130B/spi2cdl b/checks/be_checks/tech/sky130B/spi2cdl index 3f4de4e..1007264 100755 --- a/checks/be_checks/tech/sky130B/spi2cdl +++ b/checks/be_checks/tech/sky130B/spi2cdl @@ -29,7 +29,7 @@ awk ' print "R" $0, "$SUB=" bulk; next; } -/^X.*sky130_fd_pr__reram_reram_cell.*=/ { +/^X.*sky130_fd_pr.*_reram_cell.*=/ { print "R" $0; next; } From 57b3d2f579c5797ab13e77953ccb9ca671412ff5 Mon Sep 17 00:00:00 2001 From: "D. Mitch Bailey" Date: Fri, 10 May 2024 20:43:50 -0700 Subject: [PATCH 2/2] revert temporary chip_io lvs_config change --- checks/be_checks/tech/sky130B/lvs_config.chip_io.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checks/be_checks/tech/sky130B/lvs_config.chip_io.json b/checks/be_checks/tech/sky130B/lvs_config.chip_io.json index 77dd10a..3141d7d 100644 --- a/checks/be_checks/tech/sky130B/lvs_config.chip_io.json +++ b/checks/be_checks/tech/sky130B/lvs_config.chip_io.json @@ -55,7 +55,7 @@ "" ], "LVS_SPICE_FILES": [ - "$LVS_ROOT/spice/sky130_*_io.1_0_410+.spice" + "$PDK_ROOT/$PDK/libs.ref/sky130_fd_io/spice/*.spice" ], "LVS_VERILOG_FILES": [ "$CARAVEL_ROOT/verilog/gl/constant_block.v",