From 1dcb1d8bd8ba0a207a9994b1a7f474b9d1d9949e Mon Sep 17 00:00:00 2001 From: Saptarshi Ghosh Date: Thu, 12 Dec 2024 11:58:19 +0000 Subject: [PATCH] Preparing pictures for presentation --- .../GDS/CM.gds | Bin 66710 -> 62870 bytes .../gen_netlist.txt | 8 ++--- .../regulated_cascoded_current_mirror.py | 30 ++++++++++-------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/GDS/CM.gds b/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/GDS/CM.gds index d7bd1b1725843ddbe0c4595d5840a0824ec83286..1fb1966c2ef993c2c1c041d5e3ccfb9e0114638e 100644 GIT binary patch literal 62870 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 diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/gen_netlist.txt b/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/gen_netlist.txt index 63706823d..0062307f3 100644 --- a/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/gen_netlist.txt +++ b/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/gen_netlist.txt @@ -1,7 +1,7 @@ -.subckt CurrentMirror VREF VCOPY VDD -XA VREF VREF VDD VDD sky130_fd_pr__pfet_01v8 l=1 w=3 m=2 nf=1 -XB VCOPY VREF VDD VDD sky130_fd_pr__pfet_01v8 l=1 w=3 m=2 nf=1 -XDUMMY VDD VDD VDD VDD sky130_fd_pr__pfet_01v8 l=1 w=3 m=2 +.subckt CurrentMirror VREF VCOPY VSS +XA VREF VREF VSS VSS sky130_fd_pr__nfet_01v8 l=0.5 w=3 m=2 nf=1 +XB VCOPY VREF VSS VSS sky130_fd_pr__nfet_01v8 l=0.5 w=3 m=2 nf=1 +XDUMMY VSS VSS VSS VSS sky130_fd_pr__nfet_01v8 l=0.5 w=3 m=2 .ends CurrentMirror \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/regulated_cascoded_current_mirror.py b/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/regulated_cascoded_current_mirror.py index 442dea22a..aff9cea55 100644 --- a/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/regulated_cascoded_current_mirror.py +++ b/openfasoc/generators/glayout/glayout/flow/blocks/composite/regulated_cascoded_current_mirror/regulated_cascoded_current_mirror.py @@ -176,18 +176,18 @@ def CurrentMirror( source_short = CurrentMirror << c_route(pdk,CurrentMirror.ports["currm_A_source_E"],CurrentMirror.ports["currm_B_source_E"],fullbottom=True) - - # Connecting dummies to the welltie - try: - CurrentMirror << straight_route(pdk, CurrentMirror.ports["A_0_dummy_L_gsdcon_top_met_W"],CurrentMirror.ports["welltie_W_top_met_W"],glayer2="met1") - except KeyError: - pass - try: - end_col = num_cols - 1 - port1 = f'B_{end_col}_dummy_R_gdscon_top_met_E' - CurrentMirror << straight_route(pdk, CurrentMirror.ports[port1], CurrentMirror.ports["welltie_E_top_met_E"], glayer2="met1") - except KeyError: - pass + if with_dummy: + # Connecting dummies to the welltie + try: + CurrentMirror << straight_route(pdk, CurrentMirror.ports["A_0_dummy_L_gsdcon_top_met_W"],CurrentMirror.ports["welltie_W_top_met_W"],glayer2="met1") + except KeyError: + pass + try: + end_col = num_cols - 1 + port1 = f'B_{end_col}_dummy_R_gdscon_top_met_E' + CurrentMirror << straight_route(pdk, CurrentMirror.ports[port1], CurrentMirror.ports["welltie_E_top_met_E"], glayer2="met1") + except KeyError: + pass # add well (probably unnecessary) @@ -202,7 +202,7 @@ def CurrentMirror( else: raise ValueError("type must be either nfet or pfet") - + #Connecting the source of the fets to the bulk ??? src2bulk=CurrentMirror << straight_route(pdk, source_short.ports["con_N"],CurrentMirror.ports["currm_welltie_N_top_met_W"], glayer2="met2") @@ -316,10 +316,12 @@ def sky130_add_current_mirror_labels( # Main function to generate the current mirror layout # mappedpdk, Width, Length, num_cols, fingers, transistor type -comp = CurrentMirror(sky130,3,1,2,1, type='nfet', with_substrate_tap=False, with_tie=True) +comp = CurrentMirror(sky130,3,0.5,2,1, type='nfet') # Add labels to the current mirror layout comp = sky130_add_current_mirror_labels(comp, transistor_type='nfet', pdk=sky130) + + # Write the current mirror layout to a GDS file comp.name = "CM" delete_files_in_directory("GDS/")