Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release of continuous SPICE MOSFET models #380

Open
hpretl opened this issue Jul 5, 2022 · 65 comments
Open

Release of continuous SPICE MOSFET models #380

hpretl opened this issue Jul 5, 2022 · 65 comments
Labels
files-model-spice Issues related to Spice model files. type-enhancement New feature or request

Comments

@hpretl
Copy link

hpretl commented Jul 5, 2022

Issue

Currently, the only available SPICE transistor models are binned models. The model binning causes huge model files (leading to a slow simulation startup) and discontinuities across parameter sweep, especially W and L.

The release of continuous SPICE MOSFET models would solve all of these issues.

@QuantamHD
Copy link
Collaborator

I don't believe the continuous models exist. I could be totally wrong, but in the PDK provided to us by SkyWater in both the new and old version the models are binned.

We're currently working with some third parties to recharaterize the models, but that work is still ongoing. Feel free to correct me if I'm off though.

@RTimothyEdwards anything you can add?

@hpretl
Copy link
Author

hpretl commented Jul 5, 2022

These continuous models apparently do exist, but are not yet released. Even if binning is used, usually there are only a few bins to break down the huge W and L variations into something more manageable, but this is not done as fine-grained as in the currently released SkyWater PDK.

@QuantamHD
Copy link
Collaborator

QuantamHD commented Jul 5, 2022

I'm a software engineer by trade, so im not an expert on EE topics, but I'm on the Google team for this. If I can release these for you I'd be more than happy to, but in both the s130 and sky130 nda PDKs it looked like the models were binned.

Do you have a pointer to where they could be? We also talk to the CTO of SkyWater regularly if you have a contact we could point him towards.

@hpretl
Copy link
Author

hpretl commented Jul 5, 2022

I have no access to the NDA-versions of the PDKs, so I can't check myself. I was just believing that they should be available in SkyWater, at least that is my (and many analog designers) hope.

@QuantamHD
Copy link
Collaborator

I've confirmed that they do in fact exist. The blocker seems to be the conversion from the proprietary formats is not in state that easily allows us to review it. I'll see if we can rectify it.

@proppy proppy added files-model-spice Issues related to Spice model files. type-enhancement New feature or request labels Jul 6, 2022
@mattvenn
Copy link

any progress on this? I know a lot of people are asking for it.

@RTimothyEdwards
Copy link
Collaborator

@proppy has agreed to help with this, so as soon as I am able to get to it, we will get this merged into the repository.

@RTimothyEdwards
Copy link
Collaborator

Since it has not been mentioned in this issue, I should add that I have the converted and working continuous models in a form compatible with ngspice, integrated into the PDK, and generated a patch file to apply to the repository, which was completed maybe four months ago or more. It only requires someone on the Google side to merge it.

@QuantamHD
Copy link
Collaborator

There is a mild complicating factor. The patch as currently formatted doesn't allow an easy comparison to the base of this repo since there was a reorganization step applied to the directory structure. This means that it requires another line by line manual review of the files in question.

@mithro has told me that we need to generate a patch against the current directory structure before he is willing to review.

@QuantamHD
Copy link
Collaborator

@RTimothyEdwards if we can generate another patch that follows that restriction it should allow an easy export process. I have looked into generating one, and @proppy has done the same. We haven't made a lot of progress since it's always a bit unclear which tools needs to be run from what branch to generate the correct output.

@RTimothyEdwards
Copy link
Collaborator

@QuantamHD : I have all the scripts that I used to generate the files in the patch from the base s130 repository. However, those scripts deal with the private SkyWater repository we have under NDA, so I cannot make them public. But I am happy to hand off everything I have to you and @proppy and then we can work through it properly.

@QuantamHD
Copy link
Collaborator

That sounds like a plan. If you can push those scripts to the google source repo we can start modifying it to generate a diff that will allow a quick review and release.

@RTimothyEdwards
Copy link
Collaborator

@QuantamHD : Which repository, and which branch?

@QuantamHD
Copy link
Collaborator

https://foss-eda-tools.googlesource.com/skywater-pdk-audit/

new branch, you choose the name

@RTimothyEdwards
Copy link
Collaborator

@QuantamHD : Got it; will do.

@RTimothyEdwards
Copy link
Collaborator

@QuantamHD : Pushed as branch continuous_models. I did not attempt to integrate this into skywater-pdk-audit itself; I just dumped what I have into a new directory s130_models. There is a README file in that directory that has instructions on how to build the ngspice-compatible models and run the device tests.

Also please note that these scripts only generate the ngspice-compatible continuous models and associated files. The patch file I generated is the result of a lot more work which was largely done by hand, so sort through the existing and new PDKs and determine what needs to be kept, what needs to be replaced, and creating a new sky130.lib.spice that has the "include" statements to point to the correct files. In that patch, I did not attempt to remove the existing discrete models, so the continuous models created by the scripts I just put in pdk-audit are just put into a directory called continuous. But you can use the scripts in pdk-audit to check how the new model files were built, and to have the scripts available to be able to produce the same from the SkyWater sources.

@proppy
Copy link
Member

proppy commented Jul 28, 2022

@RTimothyEdwards Thanks for pushing this!

I gave you script a try and was able to get up until the last command, where I encounter the following issue:

+ /home/proppy/src/github.com/RTimothyEdwards/open_pdks/sky130/custom/scripts/process_params.py ngspice
Traceback (most recent call last):
  File "/home/proppy/src/github.com/RTimothyEdwards/open_pdks/sky130/custom/scripts/process_params.py", line 90, in <module>
    std_dev = float(gparam[1])
ValueError: could not convert string to float: '0.375e-10*process_mc_factor'

It seems that https://github.com/RTimothyEdwards/open_pdks/blob/8fe7f760ece2bb49b1c310e60243f0558977dae5/sky130/custom/scripts/process_params.py#L90 assumes a that std parameters are always float while the converted models are actual expressions:

find . -type f -exec grep --color=auto -nH --null -e process_mc_factor \{\} +
./models_global.spice\0125:*          vary sw_tox_lv_mc             dist=gauss   std=0.375e-10*process_mc_factor
./models_global.spice\0126:*          vary sw_tox_hv_mc             dist=gauss   std=1.25e-10*process_mc_factor
./models_global.spice\0127:*          vary sw_polycd                dist=gauss   std=1.5e-9*process_mc_factor
./models_global.spice\0128:*          vary sw_activecd              dist=gauss   std=5.0e-9*process_mc_factor
./models_global.spice\0129:*          vary sw_fox_cap               dist=gauss   std=0.0475*process_mc_factor
./models_global.spice\0130:*          vary sw_li_cap                dist=lnorm   std=0.1*process_mc_factor
./models_global.spice\0131:*          vary sw_fox_poly_cap          dist=gauss   std=0.0475*process_mc_factor
./models_global.spice\0132:*          vary sw_nw_rs_mult            dist=lnorm   std=0.12*process_mc_factor
./models_global.spice\0133:*          vary sw_pw_rs_mc              dist=gauss   std=6.6*process_mc_factor       percent=yes
./models_global.spice\0134:*          vary sw_nldd                  dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0135:*          vary sw_nsd_pw_cj             dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0136:*          vary sw_psd_nw_cj             dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0137:*          vary sw_nw_pw_cj              dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0138:*          vary sw_pw_dnw_cj             dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0139:*          vary sw_dnw_sub_cj            dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0140:*          vary sw_vth0_sky130_fd_pr__nfet_01v8_mc          dist=gauss   std=0.006*process_mc_factor
./models_global.spice\0141:*          vary sw_vth0_sky130_fd_pr__nfet_01v8_lvt_mc      dist=gauss   std=0.006*process_mc_factor
./models_global.spice\0142:*          vary sw_vth0_sky130_fd_pr__nfet_g5v0d10v5_mc       dist=gauss   std=0.010*process_mc_factor
./models_global.spice\0143:*          vary sw_vth0_sky130_fd_pr__nfet_01v8_nat_mc      dist=gauss   std=0.006*process_mc_factor
./models_global.spice\0144:*          vary sw_vth0_sky130_fd_pr__nfet_g5v0d16v0_mc   dist=gauss   std=0.035*process_mc_factor
./models_global.spice\0145:*          vary sw_vth0_sky130_fd_pr__nfet_01v8_zvt         dist=gauss   std=0.007*process_mc_factor
./models_global.spice\0146:*          vary sw_vth0_sky130_fd_pr__pfet_01v8_mc          dist=gauss   std=0.009*process_mc_factor
./models_global.spice\0147:*          vary sw_vth0_sky130_fd_pr__pfet_01v8_lvt_mc      dist=gauss   std=0.023*process_mc_factor
./models_global.spice\0148:*          vary sw_vth0_sky130_fd_pr__pfet_01v8_hvt_mc      dist=gauss   std=0.009*process_mc_factor
./models_global.spice\0149:*          vary sw_vth0_sky130_fd_pr__pfet_g5v0d10v5_mc       dist=gauss   std=0.02*process_mc_factor
./models_global.spice\0150:*          vary sw_vth0_sky130_fd_pr__pfet_g5v0d16v0_mc   dist=gauss   std=0.03*process_mc_factor
./models_global.spice\0151:*          vary sw_cap_mim_ca            dist=gauss   std=2.7*process_mc_factor       percent=yes
./models_global.spice\0152:*          vary sw_cap_mim_dw            dist=gauss   std=24e-9*process_mc_factor
./models_global.spice\0153:*          vary sw_sky130_fd_pr__res_generic_m1_rs                dist=gauss   std=5*process_mc_factor         percent=yes
./models_global.spice\0154:*          vary sw_sky130_fd_pr__res_generic_m2_rs                dist=gauss   std=5*process_mc_factor         percent=yes
./models_global.spice\0155:*          vary sw_sky130_fd_pr__res_generic_m3_rs                dist=gauss   std=5*process_mc_factor         percent=yes
./models_global.spice\0156:*          vary sw_sky130_fd_pr__res_generic_m4_rs                dist=gauss   std=5*process_mc_factor         percent=yes
./models_global.spice\0157:*          vary sw_m3_dw                 dist=gauss   std=1.6e-8*process_mc_factor
./models_global.spice\0158:*          vary sw_m4_dw                 dist=gauss   std=1.6e-8*process_mc_factor
./models_global.spice\0159:*          vary sw_rcvia                 dist=lnorm   std=0.26*process_mc_factor
./models_global.spice\0160:*          vary sw_rcvia2                dist=lnorm   std=0.21*process_mc_factor
./models_global.spice\0161:*          vary sw_rcvia3                dist=lnorm   std=0.21*process_mc_factor
./models_global.spice\0162:*          vary sw_rcvia4                dist=lnorm   std=0.21*process_mc_factor
./models_global.spice\0163:*          vary sw_rcl1                  dist=lnorm   std=0.39*process_mc_factor
./models_global.spice\0164:*          vary sw_rl1                   dist=gauss   std=5*process_mc_factor         percent=yes
./models_global.spice\0165:*          vary sw_rnw                   dist=gauss   std=3.75*process_mc_factor      percent=yes 
./models_global.spice\0166:*          vary sw_rp1                   dist=gauss   std=2.5*process_mc_factor       percent=yes 
./models_global.spice\0167:*          vary sw_rcn                   dist=lnorm   std=0.9*process_mc_factor         
./models_global.spice\0168:*          vary sw_rcp1                  dist=lnorm   std=0.86*process_mc_factor
./models_global.spice\0169:*          vary sw_rdp                   dist=gauss   std=3.75*process_mc_factor      percent=yes
./models_global.spice\0170:*          vary sw_rdn                   dist=gauss   std=2.5*process_mc_factor       percent=yes
./models_global.spice\0171:*          vary sw_poly_head_res         dist=gauss   std=2.5*process_mc_factor       percent=yes 
./models_global.spice\0172:*          vary sw_sky130_fd_pr__res_high_po_rs           dist=gauss   std=3.5*process_mc_factor       percent=yes
./models_global.spice\0173:*          vary sw_sky130_fd_pr__res_xhigh_po_rs         dist=gauss   std=4.0*process_mc_factor       percent=yes     

Is that something we should fix in the conversion process to get compute the scalar value and get rid of the express, or should we make process_params.py able to parse (and evaluate?) those?

@proppy
Copy link
Member

proppy commented Jul 28, 2022

@mithro and @QuantamHD as a lot of people are waiting for this, what do you think of dumping the converted models into a separate branch/repo and working together with the community to integrate those properly in the PDK?

@RTimothyEdwards
Copy link
Collaborator

@proppy : I'm not sure what happened with the process_params.py script. The README file states that I needed to make some minor changes to the mismatch_params.py and process_params.py files for the different syntax. The modified mismatch_params.py got copied back into the local directory but the process_params.py didn't. My best guess is that I originally corrected the routines in place, and then forgot that I had modified process_params.py and didn't copy it back into the directory locally. I have since overwritten my change, but I know what it was, so I will fix it and push the correction.

@RTimothyEdwards
Copy link
Collaborator

@proppy : I confirmed that I had modified the process_params.py script only in a local branch I made of open_pdks, so using the distribution open_pdks will not give you the right result. I copied the modified script to skywater-pdk-audit and committed it to my branch, so if you do a pull it should work now.

@proppy
Copy link
Member

proppy commented Jul 28, 2022

The README file states that I needed to make some minor changes to the mismatch_params.py and process_params.py files for the different syntax

I should probably have read it more carefully :)

I made this change in the meantime (based on mismatch_params.py) that managed to get me to the end of the script:
RTimothyEdwards/open_pdks@014acb7

@proppy
Copy link
Member

proppy commented Jul 28, 2022

I copied the modified script to skywater-pdk-audit and committed it to my branch, so if you do a pull it should work now.

Thanks I pulled your copy and got rid of my cargo-cult'ed patch :)

@RTimothyEdwards
Copy link
Collaborator

@proppy : Okay, thanks. I do need to update the scripts in the master branch of open_pdks, but this is the quicker/simpler solution for now.

@proppy
Copy link
Member

proppy commented Jul 28, 2022

Ran the tests:

Simulation summary:

Passing devices:
sky130_fd_pr__cap_mim_m3_1
sky130_fd_pr__cap_mim_m3_2
sky130_fd_pr__esd_nfet_05v0_nvt
sky130_fd_pr__esd_nfet_g5v0d10v5
sky130_fd_pr__esd_pfet_g5v0d10v5
sky130_fd_pr__nfet_01v8
sky130_fd_pr__nfet_01v8_lvt
sky130_fd_pr__nfet_03v3_nvt
sky130_fd_pr__nfet_05v0_nvt
sky130_fd_pr__nfet_20v0
sky130_fd_pr__nfet_20v0_iso
sky130_fd_pr__nfet_20v0_nvt
sky130_fd_pr__nfet_20v0_zvt
sky130_fd_pr__nfet_g5v0d10v5
sky130_fd_pr__nfet_g5v0d16v0
sky130_fd_pr__pfet_01v8
sky130_fd_pr__pfet_01v8_hvt
sky130_fd_pr__pfet_01v8_lvt
sky130_fd_pr__pfet_20v0
sky130_fd_pr__pfet_g5v0d10v5
sky130_fd_pr__pfet_g5v0d16v0
sky130_fd_pr__diode_pd2nw_05v5
sky130_fd_pr__diode_pd2nw_05v5_esd
sky130_fd_pr__diode_pd2nw_05v5_esd_v5
sky130_fd_pr__diode_pd2nw_05v5_hvt
sky130_fd_pr__diode_pd2nw_05v5_lvt
sky130_fd_pr__diode_pd2nw_11v0
sky130_fd_pr__diode_pw2nd_05v5
sky130_fd_pr__diode_pw2nd_05v5_defet
sky130_fd_pr__diode_pw2nd_05v5_esd
sky130_fd_pr__diode_pw2nd_05v5_esd_v5
sky130_fd_pr__diode_pw2nd_05v5_lvt
sky130_fd_pr__diode_pw2nd_05v5_nvt
sky130_fd_pr__diode_pw2nd_11v0
sky130_fd_pr__model__parasitic__cap_p2ps
sky130_fd_pr__model__parasitic__diode_pd2nw
sky130_fd_pr__model__parasitic__diode_ps2dn
sky130_fd_pr__model__parasitic__diode_ps2dn__extended_drain
sky130_fd_pr__model__parasitic__diode_pw2dn
sky130_fd_pr__model__parasitic__diode_pw2dn_defet
sky130_fd_pr__photodiode
sky130_fd_pr__npn_05v5_W1p00L1p00
sky130_fd_pr__npn_05v5_W1p00L2p00
sky130_fd_pr__npn_11v0_W1p00L1p00
sky130_fd_pr__pnp_05v5_W0p68L0p68
sky130_fd_pr__pnp_05v5_W3p40L3p40
sky130_fd_pr__res_generic_nd
sky130_fd_pr__res_generic_pd
sky130_fd_pr__res_iso_pw
sky130_fd_pr__res_high_po
sky130_fd_pr__res_xhigh_po

Failing devices:
sky130_fd_pr__cap_var_hvt
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_var_hvt

sky130_fd_pr__cap_var_lvt
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_var_lvt

sky130_fd_pr__esd_nfet_01v8
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__esd_nfet_01v8 w=20.35 l=0.165 m=1

sky130_fd_pr__pfet_01v8_mvt
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__pfet_01v8_mvt w=1.68 l=0.15 m=1

sky130_fd_pr__res_generic_nd__hv
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_generic_nd__hv l=10

sky130_fd_pr__res_generic_pd__hv
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_generic_pd__hv l=10

sky130_fd_pr__res_high_po_0p35
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_high_po_0p35 l=10

sky130_fd_pr__res_high_po_0p69
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_high_po_0p69 l=10

sky130_fd_pr__res_high_po_1p41
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_high_po_1p41 l=10

sky130_fd_pr__res_high_po_2p85
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_high_po_2p85 l=10

sky130_fd_pr__res_high_po_5p73
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_high_po_5p73 l=10

sky130_fd_pr__res_xhigh_po_0p35
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_xhigh_po_0p35 l=10

sky130_fd_pr__res_xhigh_po_0p69
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_xhigh_po_0p69 l=10

sky130_fd_pr__res_xhigh_po_1p41
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_xhigh_po_1p41 l=10

sky130_fd_pr__res_xhigh_po_2p85
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_xhigh_po_2p85 l=10

sky130_fd_pr__res_xhigh_po_5p73
   Reason: Error: unknown subckt: x1 0 a 0 sky130_fd_pr__res_xhigh_po_5p73 l=10

sky130_fd_pr__special_nfet_latch
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__special_nfet_latch w=0.21 l=0.15 m=1

sky130_fd_pr__special_nfet_pass
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__special_nfet_pass w=0.14 l=0.15 m=1

sky130_fd_pr__special_nfet_pass_flash
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__special_nfet_pass_flash w=0.45 l=0.15 m=1

sky130_fd_pr__special_nfet_pass_lvt
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__special_nfet_pass_lvt w=0.3 l=0.15 m=1

sky130_fd_pr__special_pfet_pass
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__special_pfet_pass w=0.14 l=0.15 m=1

sky130_fd_pr__rf_nfet_01v8_bM02W1p65L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w1p65l0p15

sky130_fd_pr__rf_nfet_01v8_bM02W1p65L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w1p65l0p18

sky130_fd_pr__rf_nfet_01v8_bM02W1p65L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w1p65l0p25

sky130_fd_pr__rf_nfet_01v8_bM02W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w3p00l0p15

sky130_fd_pr__rf_nfet_01v8_bM02W3p00L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w3p00l0p18

sky130_fd_pr__rf_nfet_01v8_bM02W3p00L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w3p00l0p25

sky130_fd_pr__rf_nfet_01v8_bM02W5p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w5p00l0p15

sky130_fd_pr__rf_nfet_01v8_bM02W5p00L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w5p00l0p18

sky130_fd_pr__rf_nfet_01v8_bM02W5p00L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm02w5p00l0p25

sky130_fd_pr__rf_nfet_01v8_bM04W1p65L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w1p65l0p15

sky130_fd_pr__rf_nfet_01v8_bM04W1p65L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w1p65l0p18

sky130_fd_pr__rf_nfet_01v8_bM04W1p65L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w1p65l0p25

sky130_fd_pr__rf_nfet_01v8_bM04W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w3p00l0p15

sky130_fd_pr__rf_nfet_01v8_bM04W3p00L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w3p00l0p18

sky130_fd_pr__rf_nfet_01v8_bM04W3p00L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w3p00l0p25

sky130_fd_pr__rf_nfet_01v8_bM04W5p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w5p00l0p15

sky130_fd_pr__rf_nfet_01v8_bM04W5p00L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w5p00l0p18

sky130_fd_pr__rf_nfet_01v8_bM04W5p00L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_bm04w5p00l0p25

sky130_fd_pr__rf_nfet_01v8_lvt_aF02W0p42L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af02w0p42l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_aF02W0p84L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af02w0p84l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_aF02W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af02w3p00l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_aF04W0p84L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af04w0p84l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_aF04W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af04w3p00l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_aF08W0p84L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af08w0p84l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_aF08W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_af08w3p00l0p15

sky130_fd_pr__rf_nfet_01v8_lvt_bM02W5p00L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_bm02w5p00l0p18

sky130_fd_pr__rf_nfet_01v8_lvt_bM02W5p00L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_bm02w5p00l0p25

sky130_fd_pr__rf_nfet_01v8_lvt_bM04W5p00L0p18
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_bm04w5p00l0p18

sky130_fd_pr__rf_nfet_01v8_lvt_bM04W5p00L0p25
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_01v8_lvt_bm04w5p00l0p25

sky130_fd_pr__rf_nfet_g5v0d10v5_bM02W3p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm02w3p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM02W5p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm02w5p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM04W3p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm04w3p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM04W5p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm04w5p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM04W7p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm04w7p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM10W3p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm10w3p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM10W5p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm10w5p00l0p50

sky130_fd_pr__rf_nfet_g5v0d10v5_bM10W7p00L0p50
   Reason: Error: unknown subckt: x1 3 2 0 0 sky130_fd_pr__rf_nfet_g5v0d10v5_bm10w7p00l0p50

sky130_fd_pr__rf_pfet_01v8_aF02W0p84L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_af02w0p84l0p15

sky130_fd_pr__rf_pfet_01v8_aF02W1p68L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_af02w1p68l0p15

sky130_fd_pr__rf_pfet_01v8_aF02W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_af02w3p00l0p15

sky130_fd_pr__rf_pfet_01v8_aF02W5p00L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_af02w5p00l0p15

sky130_fd_pr__rf_pfet_01v8_aF04W1p68L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_af04w1p68l0p15

sky130_fd_pr__rf_pfet_01v8_bM02W1p65L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w1p65l0p15

sky130_fd_pr__rf_pfet_01v8_bM02W1p65L0p18
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w1p65l0p18

sky130_fd_pr__rf_pfet_01v8_bM02W1p65L0p25
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w1p65l0p25

sky130_fd_pr__rf_pfet_01v8_bM02W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w3p00l0p15

sky130_fd_pr__rf_pfet_01v8_bM02W3p00L0p18
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w3p00l0p18

sky130_fd_pr__rf_pfet_01v8_bM02W3p00L0p25
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w3p00l0p25

sky130_fd_pr__rf_pfet_01v8_bM02W5p00L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w5p00l0p15

sky130_fd_pr__rf_pfet_01v8_bM02W5p00L0p18
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w5p00l0p18

sky130_fd_pr__rf_pfet_01v8_bM02W5p00L0p25
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm02w5p00l0p25

sky130_fd_pr__rf_pfet_01v8_bM04W1p65L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w1p65l0p15

sky130_fd_pr__rf_pfet_01v8_bM04W1p65L0p18
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w1p65l0p18

sky130_fd_pr__rf_pfet_01v8_bM04W1p65L0p25
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w1p65l0p25

sky130_fd_pr__rf_pfet_01v8_bM04W3p00L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w3p00l0p15

sky130_fd_pr__rf_pfet_01v8_bM04W3p00L0p18
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w3p00l0p18

sky130_fd_pr__rf_pfet_01v8_bM04W3p00L0p25
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w3p00l0p25

sky130_fd_pr__rf_pfet_01v8_bM04W5p00L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w5p00l0p15

sky130_fd_pr__rf_pfet_01v8_bM04W5p00L0p18
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w5p00l0p18

sky130_fd_pr__rf_pfet_01v8_bM04W5p00L0p25
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_bm04w5p00l0p25

sky130_fd_pr__rf_pfet_01v8_mvt_aF02W0p84L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_mvt_af02w0p84l0p15

sky130_fd_pr__rf_pfet_01v8_mvt_aF02W1p68L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_mvt_af02w1p68l0p15

sky130_fd_pr__rf_pfet_01v8_mvt_aF04W1p68L0p15
   Reason: Error: unknown subckt: x1 3 2 5 5 sky130_fd_pr__rf_pfet_01v8_mvt_af04w1p68l0p15

sky130_fd_pr__cap_vpp_01p8x01p8_m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_01p8x01p8_m1m2_noshield

sky130_fd_pr__cap_vpp_02p4x04p6_m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_02p4x04p6_m1m2_noshield

sky130_fd_pr__cap_vpp_02p7x06p1_m1m2m3m4_shieldl1_fingercap
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_02p7x06p1_m1m2m3m4_shieldl1_fingercap

sky130_fd_pr__cap_vpp_02p7x11p1_m1m2m3m4_shieldl1_fingercap
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_02p7x11p1_m1m2m3m4_shieldl1_fingercap

sky130_fd_pr__cap_vpp_02p7x21p1_m1m2m3m4_shieldl1_fingercap
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_02p7x21p1_m1m2m3m4_shieldl1_fingercap

sky130_fd_pr__cap_vpp_02p7x41p1_m1m2m3m4_shieldl1_fingercap
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_02p7x41p1_m1m2m3m4_shieldl1_fingercap

sky130_fd_pr__cap_vpp_02p9x06p1_m1m2m3m4_shieldl1_fingercap2
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_02p9x06p1_m1m2m3m4_shieldl1_fingercap2

sky130_fd_pr__cap_vpp_03p9x03p9_m1m2_shieldl1_floatm3
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_03p9x03p9_m1m2_shieldl1_floatm3

sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_noshield

sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_noshield_o1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_noshield_o1

sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_shieldpo_floatm3
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_shieldpo_floatm3

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield_o1nhv
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield_o1nhv

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield_o1phv
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield_o1phv

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield_o2
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_noshield_o2

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_shieldl1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2_shieldl1

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2m3_shieldl1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2m3_shieldl1

sky130_fd_pr__cap_vpp_04p4x04p6_m1m2m3_shieldl1m5_floatm4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_04p4x04p6_m1m2m3_shieldl1m5_floatm4

sky130_fd_pr__cap_vpp_05p9x05p9_m1m2m3m4_shieldl1_wafflecap
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_05p9x05p9_m1m2m3m4_shieldl1_wafflecap

sky130_fd_pr__cap_vpp_06p8x06p1_l1m1m2m3_shieldpom4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_06p8x06p1_l1m1m2m3_shieldpom4

sky130_fd_pr__cap_vpp_06p8x06p1_m1m2m3_shieldl1m4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_06p8x06p1_m1m2m3_shieldl1m4

sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_noshield

sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_noshield_o1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_noshield_o1

sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_shieldpo_floatm3
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_shieldpo_floatm3

sky130_fd_pr__cap_vpp_08p6x07p8_m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_08p6x07p8_m1m2_noshield

sky130_fd_pr__cap_vpp_08p6x07p8_m1m2_shieldl1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_08p6x07p8_m1m2_shieldl1

sky130_fd_pr__cap_vpp_08p6x07p8_m1m2m3_shieldl1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_08p6x07p8_m1m2m3_shieldl1

sky130_fd_pr__cap_vpp_08p6x07p8_m1m2m3_shieldl1m5_floatm4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_08p6x07p8_m1m2m3_shieldl1m5_floatm4

sky130_fd_pr__cap_vpp_11p3x11p3_m1m2m3m4_shieldl1_wafflecap
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_11p3x11p3_m1m2m3m4_shieldl1_wafflecap

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2_noshield

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2_shieldpom3
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2_shieldpom3

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3_shieldm4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3_shieldm4

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3_shieldpom4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3_shieldpom4

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldm5
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldm5

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldpom5
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldpom5

sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldpom5_x
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldpom5_x

sky130_fd_pr__cap_vpp_11p5x11p7_m1m2_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2_noshield

sky130_fd_pr__cap_vpp_11p5x11p7_m1m2_shieldl1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2_shieldl1

sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3_shieldl1
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3_shieldl1

sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3_shieldl1m5_floatm4
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3_shieldl1m5_floatm4

sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3m4_shieldl1m5
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3m4_shieldl1m5

sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3m4_shieldm5
   Reason: Error: unknown subckt: x1 n3 n4 0 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m2m3m4_shieldm5

sky130_fd_pr__cap_vpp_11p5x11p7_m1m4_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_11p5x11p7_m1m4_noshield

sky130_fd_pr__cap_vpp_44p7x23p1_pol1m1m2m3m4m5_noshield
   Reason: Error: unknown subckt: x1 n3 n4 0 sky130_fd_pr__cap_vpp_44p7x23p1_pol1m1m2m3m4m5_noshield


Final results:
Passes: 51
Fails:  128

@proppy
Copy link
Member

proppy commented Jul 28, 2022

Curious if that's what it's supposed to looks like:

sky130_fd_pr__nfet_01v8_lvt_ids_v_vgs

And if there is way to generate something similar the graph shown @hpretl in #381 (comment) to compare?

@RTimothyEdwards
Copy link
Collaborator

@proppy : That all looks correct. The tests are supposed to fail on the set of devices that are not included in the continuous models, which (as you can see) is quite a lot of them. All of the "fixed layout" devices (RF devices, parallel plate capacitors, etc.) are among these---there is only one layout, so only one point to characterize, so the existing model in the sky130 PDK is valid. There were previously 5 fixed-width resistor types for the "high" and "xhigh" poly resistors, so those are no longer valid models, as the continuous model subsumes all of the fixed-width types. There are no continuous models for the special SRAM devices, nor for the medium-Vt FET (which as far as I know is a valid device, so I don't know why it wasn't included in the continuous models).

FYI, you can pass a filename of devices to test to the run_spice_tests.py script. There is a file in the test/ directory called "continuous.txt" which is a list of all the devices included in the continuous models. So if you pass that file as an argument to the script, you should get (I think) 51 passes and 0 fails.

The SVG plot is correct. There is a corresponding plot sky130_fd_pr__nfet_01v8_lvt_ids_v_vds.svg that is the set of curves for Ids vs. Vds (instead of Vgs, which is the plot you posted).

Yes, it would be great to replicate @hpretl 's graph with the continuous models. The easiest way is to get the SPICE netlist that Harald used to generate that graph.

@proppy
Copy link
Member

proppy commented Jul 28, 2022

So if you pass that file as an argument to the script, you should get (I think) 51 passes and 0 fails.

Indeed!

🍡 ./run_spice_tests.py continuous.txt
...
Final results:
Passes: 55
Fails:  0

@bmurmann
Copy link

@proppy you may need finer steps in W, L and plot the current versus W or L for some fixed bias condition.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

@hpretl
Copy link
Author

hpretl commented Oct 12, 2022

What is the step width of W? Maybe this is too course, or it is indeed model discontinuities. Sometimes model issues are easier seen in the derivatives, e.g. 2nd order taken on Ids-vs-Vgs.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

What is the step width of W?

It was actually L: 0.15 → 0.35 +=0.01 in uM (the axe was misslabeled).

@RTimothyEdwards
Copy link
Collaborator

@proppy : The graph X axis should be labeled "L", not "W", since you are iterating over length, not width.
The model bins for the lengths have boundaries at 0.15um, 0.18um, 0.25um, 0.5um, 1um, 2um, 4um, 8um, 20um, and 100um.
There are definitely weirdnesses in the modeling going on at the two boundary points which are captured by your analysis, which is at 0.18um and 0.25um. Can you analyze out further?

@RTimothyEdwards
Copy link
Collaborator

@proppy : But the key will be running the same analysis on the nFET continuous model.

@bmurmann
Copy link

@proppy then this curve is probably fine, just showing SCE and reverse SCE. I would repeat with W and fine step.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

@proppy : The graph X axis should be labeled "L", not "W", since you are iterating over length, not width.

Yep, my bad I miss-labeled the axe! 👹

The model bins for the lengths have boundaries at 0.15um, 0.18um, 0.25um, 0.5um, 1um, 2um, 4um, 8um, 20um, and 100um.

Do you also have the bins value for W? or even better, is there a way for me to deduce them from the PDK files?

@proppy
Copy link
Member

proppy commented Oct 12, 2022

just showing SCE and reverse SCE

Should I reduce the bias to minimize it? (vdd is currently maxed at 1.8V in my testbench)

@proppy
Copy link
Member

proppy commented Oct 12, 2022

@proppy : But the key will be running the same analysis on the nFET continuous model.

Yes, that's what I want to do next!

@proppy
Copy link
Member

proppy commented Oct 12, 2022

Can you analyze out further?

image
W: 10
L: [0.15, 0.17, 0.18, 0.19, 0.24, 0.25, 0.26, 0.4, 0.5, 0.6, 0.9, 1, 1.1, 1.9, 2, 2.1, 3.9, 4, 4.1, 7, 8, 9, 15, 20, 25, 90, 100]

See https://colab.research.google.com/gist/proppy/8f92b08c7db874418cb5cc629f4bcf14/sky130-pyspice-playground.ipynb#scrollTo=0dZxZFhJZFxR

@bmurmann
Copy link

just showing SCE and reverse SCE

Should I reduce the bias to minimize it? (vdd is currently maxed at 1.8V in my testbench)

1.8V should be fine.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

I would repeat with W and fine step.

@bmurmann do you have an idea of the range? I don't see much going on between W: 10 → 30 += 0.2:
image

But I suspect the step is not fine enough to capture the bin boundaries.

@RTimothyEdwards
Copy link
Collaborator

@proppy : The nFET 0.18V device is very finely binned and might not be the best model to test. The boundaries of the width bins are (in microns):
0.36, 0.39, 0.42, 0.52, 0.54, 0.55, 0.58, 0.60, 0.61, 0.64, 0.65, 0.74, 0.84, 1.0, 1.26, 1.68, 2.0, 3.0, 5.0, 7.0, and 100.
So, no, there's not much going on between 10 and 30.

@RTimothyEdwards
Copy link
Collaborator

@proppy: To find the boundaries in the PDK files, I was looking at sky130_fd_pr__nfet_01v8__tt.pm3.spice (any of the corner files will do; I think they all have the same bins).
Each bin is bounded by lmin, lmax, wmin, and wmax.
For example, in the file cited above, line 34 is

* Model Flag Parameters
+ lmin = 2.0e-05 lmax = 0.0001 wmin = 7.0e-06 wmax = 0.0001

Which means that the binned length is between 20 and 100 microns, and the binned width is between 7 and 100 microns.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

another suggested by @StefanSchippers:
image

  • Vg: 0 → 1.8V += 0.01
  • Vd: 0.1V
  • L: 0.15 → 1 += 0.15
  • W: 1

@ericsmi
Copy link

ericsmi commented Oct 12, 2022

@proppy In addition or @hpretl 's suggestion to plot the derivative you might also consider making the y-axis log. This will make it easier to spot issues in the smaller dimensions.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

The boundaries of the width bins are (in microns):
0.36, 0.39, 0.42, 0.52, 0.54, 0.55, 0.58, 0.60, 0.61, 0.64, 0.65, 0.74, 0.84, 1.0, 1.26, 1.68, 2.0, 3.0, 5.0, 7.0, and 100.

  • W: 0.36 → 1.0 += 0.1
  • L: 0.15
  • Vd: 1.8V

https://colab.research.google.com/gist/proppy/94429878c7c9c60e60f499f7368e17b1/sky130-pyspice-playground.ipynb#scrollTo=9scIFl1w7Lk6

image

@RTimothyEdwards
Copy link
Collaborator

@proppy : Still not a great test since the bins in this region are tighter than your step size of 0.1um. I'm still looking for boundary discontinuities specifically; i.e., if the boundary is at 0.74um then I would like to see the measurements at 0.73um and 0.75um. The nonmonotonicity around W=0.7um in the graph above does look odd, though.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

@RTimothyEdwards just realized that the plot were using Vg: 0 (forgot to set it to something after switching from dc to op simulation) with a fixed Vd: 1.8, I guess I should retry with something positive on Vg.

@proppy
Copy link
Member

proppy commented Oct 12, 2022

if the boundary is at 0.74um then I would like to see the measurements at 0.73um and 0.75um

make sense, I was trying to scan a wider area to try to spot a pattern rather than focus on a specific boundaries.

I will craft something manually similar to what I did for L in #380 (comment)

@proppy
Copy link
Member

proppy commented Oct 12, 2022

@proppy
Copy link
Member

proppy commented Oct 12, 2022

I'm still looking for boundary discontinuities specifically

  • W: [0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.51, 0.52, 0.53, 0.54, 0.545, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60]
  • L: 0.15
  • Vd: 1.8V
  • Vg: 1.0V

image

https://colab.research.google.com/gist/proppy/94429878c7c9c60e60f499f7368e17b1/sky130-pyspice-playground.ipynb#scrollTo=B1aot5xFfbam

@proppy
Copy link
Member

proppy commented Oct 13, 2022

@lhrodovalho shared more plot on open-source-silicon.dev/#analog-design with a faster testbench (that leverage alterparam instead of re-running the full simulation).

image
image
image
image

consolidated the testbed and plots in this notebook:
https://colab.research.google.com/gist/proppy/68a62fd4966182fad8f2eb054bddc0e1/sky130-ngspice-playground.ipynb

@proppy
Copy link
Member

proppy commented Oct 21, 2022

One good news and one bad news:

See https://colab.research.google.com/gist/proppy/1b8eb787be44025e75bf6c5a9aa652fd/sky130-ngspice-playground.ipynb

image
image
image
image

@proppy
Copy link
Member

proppy commented Oct 21, 2022

@RTimothyEdwards there does seems to be some contraints similar to what you highlighted in #380 (comment) in the continuous_model directory, see:

373 matches for "lmax" in buffer: models_fet.spice
    112:+ lmin = 4.95e-07 lmax = 3.05e-06 wmin = 1.9995e-05 wmax = 1.0005e-03
    532:+ lmin = 4.95e-07 lmax = 3.05e-06 wmin = 1.9995e-05 wmax = 1.0005e-03
    907:+ level = 54 lmin = 2.2E-6 lmax = 2.02E-5 wmin = 6E-5
    989:+ level = 54 lmin = 7E-7 lmax = 2.2E-6 wmin = 6E-5
   1077:+ level = 54 lmin = 2.2E-6 lmax = 2.02E-5 wmin = 5E-5
   1159:+ level = 54 lmin = 7E-7 lmax = 2.2E-6 wmin = 5E-5
   1247:+ level = 54 lmin = 2.2E-6 lmax = 2.02E-5 wmin = 2E-5
   1329:+ level = 54 lmin = 7E-7 lmax = 2.2E-6 wmin = 2E-5
   1423:+ level = 54 lmin = 2.2E-6 lmax = 2.02E-5 wmin = 5E-6
   1506:+ level = 54 lmin = 7E-7 lmax = 2.2E-6 wmin = 5E-6
   1689:+ lmin = 4.95e-07 lmax = 3.05e-06 wmin = 1.9995e-05 wmax = 0.0011
   2089:+ lmin = 4.95e-07 lmax = 6.05e-06 wmin = 2.995e-05 wmax = 1.0005e-03
   2458:+ lmin = 8.95e-07 lmax = 4.05e-06 wmin = 9.995e-06 wmax = 1.0005e-03
   2805:+ lmin = 1.6e-07 lmax = 1.87e-07 wmin = 5.395e-06 wmax = 1.0355e-03
   3124:+ lmin = 5.45e-07 lmax = 1.05e-06 wmin = 17.495e-06 wmax = 1.05e-04
   3432:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
   3519:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
   3606:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
   3702:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7E-6
   3799:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 7E-6
   3895:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 7E-6
   3991:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 7E-6
   4088:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 7E-6
   4184:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5E-6
   4279:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5E-6
   4374:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5E-6
   4488:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5E-6
   4603:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5E-6
   4717:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5E-6
   4831:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5E-6
   4947:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5E-6
   5062:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
   5157:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
   5252:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
   5367:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 3E-6
   5481:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 3E-6
   5595:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 3E-6
   5709:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 3E-6
   5825:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 3E-6
   5940:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
   6035:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
   6130:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
   6244:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
   6359:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 1E-6
   6473:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 1E-6
   6588:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 1E-6
   6704:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 1E-6
   6819:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
   6906:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
   6993:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
   7109:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
   7226:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 4.2E-7
   7344:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 4.2E-7
   7462:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 4.2E-7
   7580:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 4.2E-7
   7727:+ level = 54 lmin = 6E-7 lmax = 9.079999999999999E-7 wmin = 4E-6
   7814:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 4E-6
   7917:+ level = 54 lmin = 6E-7 lmax = 9.079999999999999E-7 wmin = 1E-6
   8004:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 1E-6
   8107:+ level = 54 lmin = 6E-7 lmax = 9.079999999999999E-7 wmin = 7E-7
   8199:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 7E-7
   8305:+ level = 54 lmin = 6E-7 lmax = 9.079999999999999E-7 wmin = 4.2E-7
   8413:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 4.2E-7
   8552:+ level = 54 lmin = 8E-6 lmax = 2.525E-5 wmin = 1E-5
   8644:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-5
   8741:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-5
   8833:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-5
   8926:+ level = 54 lmin = 9E-7 lmax = 1E-6 wmin = 1E-5
   9013:+ level = 54 lmin = 8E-6 lmax = 2.525E-5 wmin = 1E-6
   9105:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
   9222:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
   9330:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
   9441:+ level = 54 lmin = 9E-7 lmax = 1E-6 wmin = 1E-6
   9536:+ level = 54 lmin = 8E-6 lmax = 2.525E-5 wmin = 4.2E-7
   9628:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
   9719:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
   9811:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
   9916:+ level = 54 lmin = 9E-7 lmax = 1E-6 wmin = 4.2E-7
  10054:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
  10141:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
  10235:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
  10329:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7E-6
  10426:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 7E-6
  10523:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 7E-6
  10620:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 7E-6
  10718:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 7E-6
  10815:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5E-6
  10909:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5E-6
  11018:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5E-6
  11129:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5E-6
  11247:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5E-6
  11365:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5E-6
  11481:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5E-6
  11599:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5E-6
  11717:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
  11811:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
  11921:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
  12034:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 3E-6
  12153:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 3E-6
  12272:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 3E-6
  12387:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 3E-6
  12506:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 3E-6
  12624:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
  12718:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
  12828:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
  12938:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
  13056:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 1E-6
  13175:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 1E-6
  13293:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 1E-6
  13411:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 1E-6
  13514:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5.5E-7
  13609:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5.5E-7
  13720:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5.5E-7
  13835:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5.5E-7
  13956:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5.5E-7
  14077:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5.5E-7
  14196:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5.5E-7
  14315:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5.5E-7
  14434:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
  14545:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
  14656:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
  14772:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
  14892:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 4.2E-7
  15011:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 4.2E-7
  15129:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 4.2E-7
  15248:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 4.2E-7
  15398:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 2E-5
  15485:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 2E-5
  15577:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 2E-5
  15669:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 2E-5
  15761:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 2E-5
  15854:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 2E-5
  15941:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 2E-5
  16033:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1.5E-5
  16120:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1.5E-5
  16212:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1.5E-5
  16304:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1.5E-5
  16403:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 1.5E-5
  16503:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 1.5E-5
  16590:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 1.5E-5
  16689:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
  16776:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
  16868:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
  16960:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7E-6
  17062:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 7E-6
  17165:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 7E-6
  17252:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 7E-6
  17351:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5E-6
  17443:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5E-6
  17545:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5E-6
  17647:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5E-6
  17747:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 5E-6
  17851:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 5E-6
  17943:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 5E-6
  18045:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
  18136:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
  18236:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
  18337:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 3E-6
  18438:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 3E-6
  18539:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 3E-6
  18642:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 3E-6
  18741:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
  18834:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
  18936:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
  19038:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
  19141:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 1E-6
  19245:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 1E-6
  19350:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 1E-6
  19451:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7.5E-7
  19544:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7.5E-7
  19645:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7.5E-7
  19747:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7.5E-7
  19852:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 7.5E-7
  19957:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 7.5E-7
  20056:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 7.5E-7
  20158:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
  20251:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
  20355:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
  20459:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
  20562:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 4.2E-7
  20665:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 4.2E-7
  20764:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 4.2E-7
  20927:+ level = 54 lmin = 2.16E-6 lmax = 2.02E-5 wmin = 5E-6
  21006:+ level = 54 lmin = 6.6E-7 lmax = 2.16E-6 wmin = 5E-6
  21157:+ lmin = 4.95e-07 lmax = 5.05e-07 wmin = 2.9995e-05 wmax = 1.0105e-03
  21523:+ lmin = 5.45e-07 lmax = 5.55e-07 wmin = 1.4495e-05 wmax = 1.05e-03
  21830:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
  21917:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
  22013:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
  22110:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7E-6
  22208:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 7E-6
  22305:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 7E-6
  22403:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 7E-6
  22501:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 7E-6
  22599:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5E-6
  22695:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5E-6
  22814:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5E-6
  22935:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5E-6
  23055:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5E-6
  23177:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5E-6
  23298:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5E-6
  23417:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5E-6
  23535:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
  23631:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
  23748:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
  23865:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 3E-6
  23984:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 3E-6
  24106:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 3E-6
  24226:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 3E-6
  24344:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 3E-6
  24461:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
  24557:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
  24673:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
  24791:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
  24911:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 1E-6
  25032:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 1E-6
  25153:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 1E-6
  25272:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 1E-6
  25390:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5.5E-7
  25486:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5.5E-7
  25605:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5.5E-7
  25725:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5.5E-7
  25847:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5.5E-7
  25969:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5.5E-7
  26090:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5.5E-7
  26209:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5.5E-7
  26326:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
  26442:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
  26560:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
  26677:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
  26799:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 4.2E-7
  26923:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 4.2E-7
  27041:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 4.2E-7
  27132:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 4.2E-7
  27254:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
  27341:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
  27433:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
  27524:+ level = 54 lmin = 1.5E-6 lmax = 2E-6 wmin = 7E-6
  27615:+ level = 54 lmin = 1E-6 lmax = 1.5E-6 wmin = 7E-6
  27708:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 7E-6
  27802:+ level = 54 lmin = 3.5E-7 lmax = 5E-7 wmin = 7E-6
  27894:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5E-6
  27984:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5E-6
  28083:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5E-6
  28183:+ level = 54 lmin = 1.5E-6 lmax = 2E-6 wmin = 5E-6
  28286:+ level = 54 lmin = 1E-6 lmax = 1.5E-6 wmin = 5E-6
  28392:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5E-6
  28499:+ level = 54 lmin = 3.5E-7 lmax = 5E-7 wmin = 5E-6
  28599:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
  28690:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
  28789:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
  28887:+ level = 54 lmin = 1.5E-6 lmax = 2E-6 wmin = 3E-6
  28990:+ level = 54 lmin = 1E-6 lmax = 1.5E-6 wmin = 3E-6
  29095:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 3E-6
  29200:+ level = 54 lmin = 3.5E-7 lmax = 5E-7 wmin = 3E-6
  29304:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
  29395:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
  29495:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
  29594:+ level = 54 lmin = 1.5E-6 lmax = 2E-6 wmin = 1E-6
  29695:+ level = 54 lmin = 1E-6 lmax = 1.5E-6 wmin = 1E-6
  29799:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 1E-6
  29904:+ level = 54 lmin = 3.5E-7 lmax = 5E-7 wmin = 1E-6
  30012:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5.5E-7
  30104:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5.5E-7
  30207:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5.5E-7
  30309:+ level = 54 lmin = 1.5E-6 lmax = 2E-6 wmin = 5.5E-7
  30417:+ level = 54 lmin = 1E-6 lmax = 1.5E-6 wmin = 5.5E-7
  30511:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5.5E-7
  30618:+ level = 54 lmin = 3.5E-7 lmax = 5E-7 wmin = 5.5E-7
  30725:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
  30824:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
  30927:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
  31028:+ level = 54 lmin = 1.5E-6 lmax = 2E-6 wmin = 4.2E-7
  31135:+ level = 54 lmin = 1E-6 lmax = 1.5E-6 wmin = 4.2E-7
  31229:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 4.2E-7
  31336:+ level = 54 lmin = 3.5E-7 lmax = 5E-7 wmin = 4.2E-7
  31469:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
  31556:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
  31652:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
  31748:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7E-6
  31846:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 7E-6
  31944:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 7E-6
  32042:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 7E-6
  32139:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 7E-6
  32235:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5E-6
  32330:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5E-6
  32444:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5E-6
  32560:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5E-6
  32681:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5E-6
  32800:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5E-6
  32921:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5E-6
  33042:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5E-6
  33160:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
  33256:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
  33373:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
  33493:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 3E-6
  33614:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 3E-6
  33733:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 3E-6
  33856:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 3E-6
  33979:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 3E-6
  34096:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
  34193:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
  34309:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
  34427:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
  34548:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 1E-6
  34668:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 1E-6
  34790:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 1E-6
  34912:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 1E-6
  35030:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 5.5E-7
  35125:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 5.5E-7
  35243:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 5.5E-7
  35362:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 5.5E-7
  35486:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 5.5E-7
  35607:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 5.5E-7
  35729:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 5.5E-7
  35848:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 5.5E-7
  35966:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
  36082:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
  36200:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
  36320:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
  36443:+ level = 54 lmin = 5E-7 lmax = 1E-6 wmin = 4.2E-7
  36565:+ level = 54 lmin = 2.5E-7 lmax = 5E-7 wmin = 4.2E-7
  36686:+ level = 54 lmin = 1.8E-7 lmax = 2.5E-7 wmin = 4.2E-7
  36783:+ level = 54 lmin = 1.5E-7 lmax = 1.8E-7 wmin = 4.2E-7
  36932:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 2E-5
  37019:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 2E-5
  37115:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 2E-5
  37214:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 2E-5
  37313:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 2E-5
  37411:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 2E-5
  37498:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 2E-5
  37596:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1.5E-5
  37683:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1.5E-5
  37779:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1.5E-5
  37878:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1.5E-5
  37986:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 1.5E-5
  38094:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 1.5E-5
  38181:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 1.5E-5
  38287:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7E-6
  38374:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7E-6
  38470:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7E-6
  38569:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7E-6
  38677:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 7E-6
  38785:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 7E-6
  38872:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 7E-6
  38978:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 3E-6
  39070:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 3E-6
  39178:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 3E-6
  39287:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 3E-6
  39398:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 3E-6
  39517:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 3E-6
  39637:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 3E-6
  39760:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 1E-6
  39856:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 1E-6
  39972:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 1E-6
  40095:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 1E-6
  40218:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 1E-6
  40337:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 1E-6
  40458:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 1E-6
  40580:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 7.5E-7
  40667:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 7.5E-7
  40763:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 7.5E-7
  40887:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 7.5E-7
  41010:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 7.5E-7
  41131:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 7.5E-7
  41251:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 7.5E-7
  41372:+ level = 54 lmin = 8E-6 lmax = 2.02E-5 wmin = 4.2E-7
  41467:+ level = 54 lmin = 4E-6 lmax = 8E-6 wmin = 4.2E-7
  41582:+ level = 54 lmin = 2E-6 lmax = 4E-6 wmin = 4.2E-7
  41704:+ level = 54 lmin = 1E-6 lmax = 2E-6 wmin = 4.2E-7
  41826:+ level = 54 lmin = 8E-7 lmax = 1E-6 wmin = 4.2E-7
  41947:+ level = 54 lmin = 6E-7 lmax = 8E-7 wmin = 4.2E-7
  42067:+ level = 54 lmin = 5E-7 lmax = 6E-7 wmin = 4.2E-7

so maybe "those are not the continuous models 🤖 we are looking for" 👋

@proppy
Copy link
Member

proppy commented Oct 21, 2022

tt_mm looks similar:
image

and mc doesn't look any better:
image

@lhrodovalho
Copy link

Monte Carlo simulations have random results and should not be used for this kind of transistor characterization. That is why the results are noisy. At least the Monte Carlo simulations are finally working with devices with sizes different from those in the bins!

@atorkmabrains
Copy link

atorkmabrains commented May 31, 2023

I was trying to investigate if the "binned" model is continuous relative to W and L meaning. That it covers all the range of W and L and doesn't have gaps in the middle. I could say based on this analysis that the models has large gaps. Here is how to reproduce my analysis.

Run the following command to extract the w and L ranges for all the bins for nfet:

grep lmin sky130_fd_pr__nfet_01v8.pm3.spice | sed 's/=/:/g' | sed 's/^\+ //g' | sed 's/\s:\s/:/g' | sed 's/^/{/' | sed 's/$/},/' > all_bins.json

You will need to make some minor manual fixes to the json above. But here is the final file:

[{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":1.255e-06,"wmax":1.265e-6},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":1.675e-06,"wmax":1.685e-6},
{"lmin":9.95e-07,"lmax":1.005e-06,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":1.995e-06,"lmax":2.005e-06,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":3.995e-06,"lmax":4.005e-06,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":7.995e-06,"lmax":8.005e-06,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":1.75e-07,"lmax":1.85e-07,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":2.45e-07,"lmax":2.55e-07,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":4.95e-07,"lmax":5.05e-07,"wmin":9.95e-07,"wmax":1.005e-6},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":1.995e-06,"wmax":2.005e-6},
{"lmin":9.95e-07,"lmax":1.005e-06,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":1.995e-06,"lmax":2.005e-06,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":3.995e-06,"lmax":4.005e-06,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":7.995e-06,"lmax":8.005e-06,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":1.75e-07,"lmax":1.85e-07,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":2.45e-07,"lmax":2.55e-07,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":4.95e-07,"lmax":5.05e-07,"wmin":2.995e-06,"wmax":3.005e-6},
{"lmin":9.95e-07,"lmax":1.005e-06,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":1.995e-06,"lmax":2.005e-06,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":3.995e-06,"lmax":4.005e-06,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":7.995e-06,"lmax":8.005e-06,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":1.75e-07,"lmax":1.85e-07,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":2.45e-07,"lmax":2.55e-07,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":4.95e-07,"lmax":5.05e-07,"wmin":4.995e-06,"wmax":5.005e-6},
{"lmin":9.95e-07,"lmax":1.005e-06,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":1.995e-06,"lmax":2.005e-06,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":3.995e-06,"lmax":4.005e-06,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":7.995e-06,"lmax":8.005e-06,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":1.75e-07,"lmax":1.85e-07,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":2.45e-07,"lmax":2.55e-07,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":4.95e-07,"lmax":5.05e-07,"wmin":6.995e-06,"wmax":7.005e-6},
{"lmin":9.95e-07,"lmax":1.005e-06,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":1.9995e-05,"lmax":2.0005e-05,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":1.995e-06,"lmax":2.005e-06,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":3.995e-06,"lmax":4.005e-06,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":7.995e-06,"lmax":8.005e-06,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":1.75e-07,"lmax":1.85e-07,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":4.95e-07,"lmax":5.05e-07,"wmin":4.15e-07,"wmax":4.25e-7},
{"lmin":9.95e-07,"lmax":1.005e-06,"wmin":5.45e-07,"wmax":5.55e-7},
{"lmin":1.995e-06,"lmax":2.005e-06,"wmin":5.45e-07,"wmax":5.55e-7},
{"lmin":3.995e-06,"lmax":4.005e-06,"wmin":5.45e-07,"wmax":5.55e-7},
{"lmin":7.995e-06,"lmax":8.005e-06,"wmin":5.45e-07,"wmax":5.55e-7},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":5.45e-07,"wmax":5.55e-7},
{"lmin":4.95e-07,"lmax":5.05e-07,"wmin":5.45e-07,"wmax":5.55e-7},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":6.35e-07,"wmax":6.45e-7},
{"lmin":1.45e-07,"lmax":1.55e-07,"wmin":8.35e-07,"wmax":8.45e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":7.39e-07,"wmax":7.41e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":3.59e-07,"wmax":3.61e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":3.89e-07,"wmax":3.91e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":5.19e-07,"wmax":5.21e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":5.39e-07,"wmax":5.41e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":5.79e-07,"wmax":5.81e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":5.99e-07,"wmax":6.01e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":6.09e-07,"wmax":6.11e-7},
{"lmin":1.49e-07,"lmax":1.51e-07,"wmin":6.49e-07,"wmax":6.51e-7},
{"lmin":1.79e-07,"lmax":1.81e-07,"wmin":6.49e-07,"wmax":6.51e-7},
{"lmin":2.49e-07,"lmax":2.51e-07,"wmin":6.49e-07,"wmax":6.51e-7},
{"lmin":4.99e-07,"lmax":5.01e-07,"wmin":6.49e-07,"wmax":6.51e-7}]

Here is the python code to plot:

import pandas as pd
import matplotlib.pyplot as plt
import json
from matplotlib.patches import Rectangle

df = pd.read_json("all_bins.json")

df.head()

df /= 1.0e-6

fig, ax = plt.subplots(1, 1, figsize=(10, 10))
for i, row in df.iterrows():
    w = row["lmax"] - row["lmin"]
    h = row["wmax"] - row["wmin"]
    ax.add_patch(Rectangle((row["lmin"], row["wmin"]), w, h))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
files-model-spice Issues related to Spice model files. type-enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

9 participants