Corrected all of the gf180mcu moscap and varactor drawing routines in the magic device generator; all of the types exist in the device generator now, and draw cleanly with and without guard rings. Also: Ran an update on the libraries to catch changes made to the Avalon Semiconductors' standard cells, and re-wrote the references.
diff --git a/gf180mcu/gf180mcu.json b/gf180mcu/gf180mcu.json index d88bf4d..ab40d9e 100644 --- a/gf180mcu/gf180mcu.json +++ b/gf180mcu/gf180mcu.json
@@ -97,8 +97,8 @@ "magic": "MAGIC_COMMIT" }, "reference": { - "open_pdks": "9233c19260cd813c3fa67dd4594fe4cc67016832", - "magic": "14afb4bd5207392dc6a2efb0b47cc176e28496ed", + "open_pdks": "2d4fecdb34596a309e19a0513541c2c0f22a84a8", + "magic": "d44aeaa1d107733532cf47b7c9f1af5374577cbf", "gf180mcu_pdk": "a897aa30369d3bcec87d9d50ce9b01f320f854ef", "gf180mcu_fd_pr": "6e186e964fb59211e214b8cde5d6b1912e13db42", "gf180mcu_fd_pv": "13f5cb3829f7ec3fe1d4469534fd60c12aaaa477", @@ -106,7 +106,7 @@ "gf180mcu_fd_sc_mcu7t5v0": "5641d172662a7d9086e5b99c5d54506c05e65cee", "gf180mcu_fd_sc_mcu9t5v0": "e0e80f5a6522f10b82165d3aeab9b8ee28e89849", "gf180mcu_fd_ip_sram": "b98653230f05be17867c70870ecacfa6a6bca7ff", - "gf180mcu_as_sc_mcu7t3v3": "8f8c3c4e2eaefda6e408e9f92322431f7bedfbe2", + "gf180mcu_as_sc_mcu7t3v3": "66751b40df57f561e530e4cd22ad82717b22e19c", "gf180mcu_re_efuse": "9941e38e7670a12f3f3a744bea4f9d2f04e6a669", "gf180mcu_ocd_io": "f06b365b763826856be080f23b46047c50467072", "gf180mcu_ocd_alpha": "0597ebd5732987dbcd149e02c38525c1c5bf2a58",
diff --git a/gf180mcu/magic/gf180mcu.tcl b/gf180mcu/magic/gf180mcu.tcl index 80a785c..8bcbb00 100644 --- a/gf180mcu/magic/gf180mcu.tcl +++ b/gf180mcu/magic/gf180mcu.tcl
@@ -127,7 +127,10 @@ magic::add_toolkit_command $layoutframe "eFuse" "magic::gencell gf180mcu::eFuse" pdk1 magic::add_toolkit_separator $layoutframe pdk1 - magic::add_toolkit_command $layoutframe "mos capacitor" "magic::gencell gf180mcu::nmoscap_3p3" pdk1 + magic::add_toolkit_command $layoutframe "nMOS capacitor" "magic::gencell gf180mcu::nmoscap_3p3" pdk1 + magic::add_toolkit_command $layoutframe "pMOS capacitor" "magic::gencell gf180mcu::pmoscap_3p3" pdk1 + magic::add_toolkit_command $layoutframe "nMOS varactor" "magic::gencell gf180mcu::nvaractor_3p3" pdk1 + magic::add_toolkit_command $layoutframe "pMOS varactor" "magic::gencell gf180mcu::pvaractor_3p3" pdk1 magic::add_toolkit_menu $layoutframe "Devices 2" pdk2 @@ -3534,7 +3537,7 @@ } #---------------------------------------------------------------- -# mosvc: Specify all user-editable default values and those +# moscap: Specify all user-editable default values and those # needed by nmoscap_3p3_check #---------------------------------------------------------------- @@ -3552,6 +3555,52 @@ class mosfet full_metal 1 compatible {nmoscap_3p3 nmoscap_6p0}} } +proc gf180mcu::pmoscap_3p3_defaults {} { + return {w 1.0 l 1.0 m 1 nf 1 diffcov 100 polycov 100 \ + guard 1 glc 1 grc 1 gtc 0 gbc 0 tbcov 100 rlcov 100 \ + topc 1 botc 1 poverlap 0 doverlap 1 lmin 0.28 wmin 0.22 \ + class mosfet full_metal 1 compatible {pmoscap_3p3 pmoscap_6p0}} +} + +proc gf180mcu::pmoscap_6p0_defaults {} { + return {w 1.0 l 1.0 m 1 nf 1 diffcov 100 polycov 100 \ + guard 1 glc 1 grc 1 gtc 0 gbc 0 tbcov 100 rlcov 100 \ + topc 1 botc 1 poverlap 0 doverlap 1 lmin 0.28 wmin 0.3 \ + class mosfet full_metal 1 compatible {pmoscap_3p3 pmoscap_6p0}} +} + +#---------------------------------------------------------------- +# Varactors (called moscaps by the foundry) +#---------------------------------------------------------------- + +proc gf180mcu::nvaractor_3p3_defaults {} { + return {w 1.0 l 1.0 m 1 nf 1 diffcov 100 polycov 100 \ + guard 1 glc 1 grc 1 gtc 0 gbc 0 tbcov 100 rlcov 100 \ + topc 1 botc 1 poverlap 0 doverlap 1 lmin 0.28 wmin 0.22 \ + class mosfet full_metal 1 compatible {nvaractor_3p3 nvaractor_6p0}} +} + +proc gf180mcu::nvaractor_6p0_defaults {} { + return {w 1.0 l 1.0 m 1 nf 1 diffcov 100 polycov 100 \ + guard 1 glc 1 grc 1 gtc 0 gbc 0 tbcov 100 rlcov 100 \ + topc 1 botc 1 poverlap 0 doverlap 1 lmin 0.28 wmin 0.3 \ + class mosfet full_metal 1 compatible {nvaractor_3p3 nvaractor_6p0}} +} + +proc gf180mcu::pvaractor_3p3_defaults {} { + return {w 1.0 l 1.0 m 1 nf 1 diffcov 100 polycov 100 \ + guard 1 glc 1 grc 1 gtc 0 gbc 0 tbcov 100 rlcov 100 \ + topc 1 botc 1 poverlap 0 doverlap 1 lmin 0.28 wmin 0.22 \ + class mosfet full_metal 1 compatible {pvaractor_3p3 pvaractor_6p0}} +} + +proc gf180mcu::pvaractor_6p0_defaults {} { + return {w 1.0 l 1.0 m 1 nf 1 diffcov 100 polycov 100 \ + guard 1 glc 1 grc 1 gtc 0 gbc 0 tbcov 100 rlcov 100 \ + topc 1 botc 1 poverlap 0 doverlap 1 lmin 0.28 wmin 0.3 \ + class mosfet full_metal 1 compatible {pvaractor_3p3 pvaractor_6p0}} +} + #---------------------------------------------------------------- # mos: Conversion from SPICE netlist parameters to toolkit #---------------------------------------------------------------- @@ -3652,6 +3701,30 @@ return [gf180mcu::mos_convert $parameters] } +proc gf180mcu::pmoscap_3p3_convert {parameters} { + return [gf180mcu::mos_convert $parameters] +} + +proc gf180mcu::pmoscap_6p0_convert {parameters} { + return [gf180mcu::mos_convert $parameters] +} + +proc gf180mcu::nvaractor_3p3_convert {parameters} { + return [gf180mcu::mos_convert $parameters] +} + +proc gf180mcu::nvaractor_6p0_convert {parameters} { + return [gf180mcu::mos_convert $parameters] +} + +proc gf180mcu::pvaractor_3p3_convert {parameters} { + return [gf180mcu::mos_convert $parameters] +} + +proc gf180mcu::pvaractor_6p0_convert {parameters} { + return [gf180mcu::mos_convert $parameters] +} + proc gf180mcu::nfet_10v0_asym_convert {parameters} { return [gf180mcu::mos_convert $parameters] } @@ -3759,6 +3832,30 @@ gf180mcu::mos_dialog nmoscap_6p0 $parameters } +proc gf180mcu::pmoscap_3p3_dialog {parameters} { + gf180mcu::mos_dialog pmoscap_3p3 $parameters +} + +proc gf180mcu::pmoscap_6p0_dialog {parameters} { + gf180mcu::mos_dialog pmoscap_6p0 $parameters +} + +proc gf180mcu::nvaractor_3p3_dialog {parameters} { + gf180mcu::mos_dialog nvaractor_3p3 $parameters +} + +proc gf180mcu::nvaractor_6p0_dialog {parameters} { + gf180mcu::mos_dialog nvaractor_6p0 $parameters +} + +proc gf180mcu::pvaractor_3p3_dialog {parameters} { + gf180mcu::mos_dialog pvaractor_3p3 $parameters +} + +proc gf180mcu::pvaractor_6p0_dialog {parameters} { + gf180mcu::mos_dialog pvaractor_6p0 $parameters +} + proc gf180mcu::nfet_10v0_asym_dialog {parameters} { gf180mcu::mos_dialog nfet_10v0_asym $parameters } @@ -4693,12 +4790,97 @@ } #------------------------ -# MOS varactor (3.3V) +# nMOS cap (3.3V) #------------------------ proc gf180mcu::nmoscap_3p3_draw {parameters} { set newdict [dict create \ - gate_type var \ + gate_type ncap \ + diff_type ndiff \ + diff_contact_type ndc \ + plus_diff_type psd \ + plus_contact_type psc \ + poly_type poly \ + poly_contact_type pc \ + sub_type pwell \ + ] + set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] + return [gf180mcu::mos_draw $drawdict] +} + +#------------------------ +# nMOS cap (6.0V) +#------------------------ + +proc gf180mcu::nmoscap_6p0_draw {parameters} { + set newdict [dict create \ + diff_poly_space 0.30 \ + diff_gate_space 0.30 \ + diff_spacing 0.36 \ + gate_type mvncap \ + diff_type mvndiff \ + diff_contact_type mvndc \ + plus_diff_type mvpsd \ + plus_contact_type mvpsc \ + poly_type poly \ + poly_contact_type pc \ + sub_type pwell \ + ] + set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] + return [gf180mcu::mos_draw $drawdict] +} + +#------------------------ +# pMOS cap (3.3V) +#------------------------ + +proc gf180mcu::pmoscap_3p3_draw {parameters} { + set newdict [dict create \ + gate_type pcap \ + diff_type pdiff \ + diff_contact_type pdc \ + plus_diff_type nsd \ + plus_contact_type nsc \ + poly_type poly \ + poly_contact_type pc \ + sub_type nwell \ + dev_surround 0.43 \ + ] + set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] + return [gf180mcu::mos_draw $drawdict] +} + +#------------------------ +# pMOS cap (6.0V) +#------------------------ + +proc gf180mcu::pmoscap_6p0_draw {parameters} { + set newdict [dict create \ + diff_poly_space 0.30 \ + diff_gate_space 0.30 \ + diff_spacing 0.36 \ + gate_type mvpcap \ + diff_type mvpdiff \ + diff_contact_type mvpdc \ + plus_diff_type mvnsd \ + plus_contact_type mvnsc \ + poly_type poly \ + poly_contact_type pc \ + sub_type nwell \ + sub_surround 0.16 \ + dev_surround 0.60 \ + ] + set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] + return [gf180mcu::mos_draw $drawdict] +} + +#------------------------ +# n-varactor (3.3V) +#------------------------ + +proc gf180mcu::nvaractor_3p3_draw {parameters} { + set newdict [dict create \ + gate_type nvar \ diff_type nsd \ diff_contact_type nsc \ plus_diff_type psd \ @@ -4708,21 +4890,22 @@ sub_type pwell \ dev_sub_type nwell \ dev_sub_dist 0.12 \ + dev_surround -0.01 \ ] set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] return [gf180mcu::mos_draw $drawdict] } #------------------------ -# MOS varactor (6.0V) +# n-varactor (6.0V) #------------------------ -proc gf180mcu::nmoscap_6p0_draw {parameters} { +proc gf180mcu::nvaractor_6p0_draw {parameters} { set newdict [dict create \ diff_poly_space 0.30 \ diff_gate_space 0.30 \ diff_spacing 0.36 \ - gate_type mvvar \ + gate_type mvnvar \ diff_type mvnsd \ diff_contact_type mvnsc \ plus_diff_type mvpsd \ @@ -4732,6 +4915,56 @@ sub_type pwell \ sub_surround 0.16 \ dev_sub_type nwell \ + dev_sub_dist 0.16 \ + dev_surround -0.01 \ + ] + set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] + return [gf180mcu::mos_draw $drawdict] +} + +#------------------------ +# p-varactor (3.3V) +#------------------------ + +proc gf180mcu::pvaractor_3p3_draw {parameters} { + set newdict [dict create \ + gate_type pvar \ + diff_type psd \ + diff_contact_type psc \ + plus_diff_type nsd \ + plus_contact_type nsc \ + poly_type poly \ + poly_contact_type pc \ + sub_type nwell \ + sub_surround 0.26 \ + dev_sub_type pwell \ + dev_sub_dist 0.24 \ + dev_surround -0.01 \ + ] + set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] + return [gf180mcu::mos_draw $drawdict] +} + +#------------------------ +# p-varactor (6.0V) +#------------------------ + +proc gf180mcu::pvaractor_6p0_draw {parameters} { + set newdict [dict create \ + diff_poly_space 0.30 \ + diff_gate_space 0.30 \ + diff_spacing 0.36 \ + gate_type mvpvar \ + diff_type mvpsd \ + diff_contact_type mvpsc \ + plus_diff_type mvnsd \ + plus_contact_type mvnsc \ + poly_type poly \ + poly_contact_type pc \ + sub_type nwell \ + sub_surround 0.20 \ + dev_sub_type pwell \ + dev_surround -0.01 \ ] set drawdict [dict merge $gf180mcu::ruleset $newdict $parameters] return [gf180mcu::mos_draw $drawdict] @@ -4889,6 +5122,30 @@ return [gf180mcu::mos_check $parameters] } +proc gf180mcu::pmoscap_3p3_check {parameters} { + return [gf180mcu::mos_check $parameters] +} + +proc gf180mcu::pmoscap_6p0_check {parameters} { + return [gf180mcu::mos_check $parameters] +} + +proc gf180mcu::nvaractor_3p3_check {parameters} { + return [gf180mcu::mos_check $parameters] +} + +proc gf180mcu::nvaractor_6p0_check {parameters} { + return [gf180mcu::mos_check $parameters] +} + +proc gf180mcu::pvaractor_3p3_check {parameters} { + return [gf180mcu::mos_check $parameters] +} + +proc gf180mcu::pvaractor_6p0_check {parameters} { + return [gf180mcu::mos_check $parameters] +} + proc gf180mcu::nfet_10v0_asym_check {parameters} { return [gf180mcu::mos_check $parameters] }
diff --git a/gf180mcu/magic/gf180mcu.tech b/gf180mcu/magic/gf180mcu.tech index 2cccb2e..8a37bcb 100644 --- a/gf180mcu/magic/gf180mcu.tech +++ b/gf180mcu/magic/gf180mcu.tech
@@ -115,7 +115,7 @@ -active srampdiff -active sramndc -active srampdc -# Varactors +# Varactors. NOTE: GF does not provide varactor models. active nvaractor,nvaract,nvar active pvaractor,pvaract,pvar active mvnvaractor,mvnvaract,mvnvar
diff --git a/sky130/sky130.json b/sky130/sky130.json index eb7caa5..ce55c29 100644 --- a/sky130/sky130.json +++ b/sky130/sky130.json
@@ -94,8 +94,8 @@ "magic": "MAGIC_COMMIT" }, "reference": { - "open_pdks": "9233c19260cd813c3fa67dd4594fe4cc67016832", - "magic": "14afb4bd5207392dc6a2efb0b47cc176e28496ed", + "open_pdks": "2d4fecdb34596a309e19a0513541c2c0f22a84a8", + "magic": "d44aeaa1d107733532cf47b7c9f1af5374577cbf", "sky130_fd_pr": "403964dc7f9cca5ec1a8cc7b4f2a6f532b781676", "sky130_fd_io": "b0c377d9c91b4152e0edd3a766a19185df819888", "sky130_fd_sc_hs": "c3d7991a9bcb4fc33cbd43262b44bb5560d6fdd0",