From 8bd30da88b77af22d74c3742f51920f8a6685247 Mon Sep 17 00:00:00 2001 From: tsengs0 Date: Sat, 23 Nov 2024 09:22:20 +0000 Subject: [PATCH] Final modification of the intergititized layout of the transmission gate PCell --- .../transmission_gate_saltychip/comp_dc.py | 7 +- .../transmission_gate_saltychip/eval.py | 18 +- .../gds/gate_ctrl_inv.gds | Bin 28126 -> 0 bytes .../gds/tg_ver1.gds | Bin 66472 -> 0 bytes .../gds/tg_ver2.gds | Bin 43572 -> 0 bytes .../gds/tg_with_ctrl.gds | Bin 67638 -> 0 bytes .../reconfig_inv.py | 2 +- .../drc/long_width_tg_3f598baa_drc.rpt | 3 + .../lvs/long_width_tg_3f598baa_lvs.rpt | 67 ++++ .../report/figures/tg_with_inv.png | Bin 99588 -> 0 bytes .../transmission_gate.py | 292 ++++++------------ 11 files changed, 188 insertions(+), 201 deletions(-) delete mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/gate_ctrl_inv.gds delete mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_ver1.gds delete mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_ver2.gds delete mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_with_ctrl.gds create mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/drc/long_width_tg_3f598baa_drc.rpt create mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/lvs/long_width_tg_3f598baa_lvs.rpt delete mode 100644 openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/report/figures/tg_with_inv.png diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/comp_dc.py b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/comp_dc.py index 2cc659058..5b9a59b20 100644 --- a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/comp_dc.py +++ b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/comp_dc.py @@ -1,4 +1,5 @@ def initialise(): - global inv_channel_width_base, tg_channel_width_base - inv_channel_width_base = 3.0 - tg_channel_width_base = 3.0 \ No newline at end of file + global inv_fet_width_base, tg_fet_width_base, tg_fet_width_factor + inv_fet_width_base = 3.0 + tg_fet_width_base = 3.0 + tg_fet_width_factor = tg_fet_width_base*4 \ No newline at end of file diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/eval.py b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/eval.py index 69d63a3ab..601503473 100644 --- a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/eval.py +++ b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/eval.py @@ -8,10 +8,12 @@ TARGET_PDK = sky130 PWD_OUTPUT = subprocess.run(['pwd'], capture_output=True, text=True) GDS_DIR = PWD_OUTPUT.stdout.strip() + "/gds" +DRC_RPT_DIR = PWD_OUTPUT.stdout.strip() + "/regression/drc" +LVS_RPT_DIR = PWD_OUTPUT.stdout.strip() + "/regression/lvs" -pmos_width = 6.0*2 +pmos_width = 12.0*1 pmos_length = 0.15 -nmos_width = 6.0*2 +nmos_width = 12.0*1 nmos_length = 0.15 def basic_tg_eval(): @@ -27,15 +29,19 @@ def basic_tg_eval(): tg_dut.show() tg_dut.write_gds(f"{GDS_DIR}/{tg_dut.name}.gds") - ''' magic_drc_result = sky130.drc_magic( layout=tg_dut, - design_name=tg_dut.name#, - #output_file=f"{absolute_path}/{tg.name}.rpt" + design_name=tg_dut.name, + output_file=f"{DRC_RPT_DIR}/{tg_dut.name}_drc.rpt" ) print(f"Magic DRC result ({tg_dut.name}): \n", magic_drc_result) print("--------------------------------------") - ''' + netgen_lvs_result = sky130.lvs_netgen( + layout=tg_dut, + design_name=tg_dut.name, + output_file_path=f"{LVS_RPT_DIR}/{tg_dut.name}_lvs.rpt", + copy_intermediate_files=True + ) def gate_ctrl_inv_eval(): gate_ctrl_inv = reconfig_inv.reconfig_inv( diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/gate_ctrl_inv.gds b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/gate_ctrl_inv.gds deleted file mode 100644 index b3f49cb536c11467fa9864655f081cd3a766a894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28126 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 N_TkCAnK)@u@xM;s|1bam diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_ver1.gds b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_ver1.gds deleted file mode 100644 index a4ca0e18d850cf45e1340dbd68d3a2a194353ec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66472 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 diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_ver2.gds b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/gds/tg_ver2.gds deleted file mode 100644 index 9b33569fd4577a511dc8a2626af37be59d7fae0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43572 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 SD)Dnwr3y$li%Kk9Sp7d@K)$j7 diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/reconfig_inv.py b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/reconfig_inv.py index 914c025a2..97ab884af 100755 --- a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/reconfig_inv.py +++ b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/reconfig_inv.py @@ -176,7 +176,7 @@ def reconfig_inv( ) -> Component: if pmos_width != nmos_width: raise ValueError("PCell constraint: the widths of PMOS and NMOS must be identical") - elif pmos_width >= comp_dc.inv_channel_width_base: # Long-channel PMOS and NMOS + elif pmos_width >= comp_dc.inv_fet_width_base: # Long-channel PMOS and NMOS inv = long_channel_inv( pdk=pdk, component_name=component_name, diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/drc/long_width_tg_3f598baa_drc.rpt b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/drc/long_width_tg_3f598baa_drc.rpt new file mode 100644 index 000000000..d599f9790 --- /dev/null +++ b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/drc/long_width_tg_3f598baa_drc.rpt @@ -0,0 +1,3 @@ +long_width_tg_3f598baa count: +---------------------------------------- + diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/lvs/long_width_tg_3f598baa_lvs.rpt b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/lvs/long_width_tg_3f598baa_lvs.rpt new file mode 100644 index 000000000..41ca2a7df --- /dev/null +++ b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/regression/lvs/long_width_tg_3f598baa_lvs.rpt @@ -0,0 +1,67 @@ + +Circuit 1 cell sky130_fd_pr__pfet_01v8 and Circuit 2 cell sky130_fd_pr__pfet_01v8 are black boxes. +Warning: Equate pins: cell sky130_fd_pr__pfet_01v8 is a placeholder, treated as a black box. +Warning: Equate pins: cell sky130_fd_pr__pfet_01v8 is a placeholder, treated as a black box. + +Subcircuit pins: +Circuit 1: sky130_fd_pr__pfet_01v8 |Circuit 2: sky130_fd_pr__pfet_01v8 +-------------------------------------------|------------------------------------------- +1 |1 +2 |2 +3 |3 +4 |4 +--------------------------------------------------------------------------------------- +Cell pin lists are equivalent. +Device classes sky130_fd_pr__pfet_01v8 and sky130_fd_pr__pfet_01v8 are equivalent. + +Circuit 1 cell sky130_fd_pr__nfet_01v8 and Circuit 2 cell sky130_fd_pr__nfet_01v8 are black boxes. +Warning: Equate pins: cell sky130_fd_pr__nfet_01v8 is a placeholder, treated as a black box. +Warning: Equate pins: cell sky130_fd_pr__nfet_01v8 is a placeholder, treated as a black box. + +Subcircuit pins: +Circuit 1: sky130_fd_pr__nfet_01v8 |Circuit 2: sky130_fd_pr__nfet_01v8 +-------------------------------------------|------------------------------------------- +1 |1 +2 |2 +3 |3 +4 |4 +--------------------------------------------------------------------------------------- +Cell pin lists are equivalent. +Device classes sky130_fd_pr__nfet_01v8 and sky130_fd_pr__nfet_01v8 are equivalent. +Flattening unmatched subcell PMOS in circuit long_width_tg_3f598baa (1)(2 instances) +Flattening unmatched subcell NMOS in circuit long_width_tg_3f598baa (1)(2 instances) + +Cell long_width_tg_3f598baa (1) disconnected node: VDD +Cell long_width_tg_3f598baa (1) disconnected node: VSS +Class long_width_tg_3f598baa (0): Merged 6 parallel devices. +Class long_width_tg_3f598baa (1): Merged 2 parallel devices. +Cell long_width_tg_3f598baa (1) disconnected node: VDD +Cell long_width_tg_3f598baa (1) disconnected node: VSS +Subcircuit summary: +Circuit 1: long_width_tg_3f598baa |Circuit 2: long_width_tg_3f598baa +-------------------------------------------|------------------------------------------- +sky130_fd_pr__pfet_01v8 (4->1) |sky130_fd_pr__pfet_01v8 (8->1) +sky130_fd_pr__nfet_01v8 (4->1) |sky130_fd_pr__nfet_01v8 (8->1) +Number of devices: 2 |Number of devices: 2 +Number of nets: 6 **Mismatch** |Number of nets: 5 **Mismatch** +--------------------------------------------------------------------------------------- +NET mismatches: Class fragments follow (with fanout counts): +Circuit 1: long_width_tg_3f598baa |Circuit 2: long_width_tg_3f598baa + +--------------------------------------------------------------------------------------- +Net: w_n697_603# |Net: B + sky130_fd_pr__pfet_01v8/4 = 1 | sky130_fd_pr__pfet_01v8/4 = 1 + | sky130_fd_pr__nfet_01v8/4 = 1 + | +Net: (no pins) |(no matching net) + sky130_fd_pr__nfet_01v8/4 = 1 | +--------------------------------------------------------------------------------------- +Netlists do not match. + +Subcircuit pins: +Circuit 1: long_width_tg_3f598baa |Circuit 2: long_width_tg_3f598baa +-------------------------------------------|------------------------------------------- +Cell pin lists are equivalent. +Device classes long_width_tg_3f598baa and long_width_tg_3f598baa are equivalent. + +Final result: Netlists do not match. diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/report/figures/tg_with_inv.png b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/report/figures/tg_with_inv.png deleted file mode 100644 index c6b93bcc349dd5f0aac4becb0b31c526e9ef4848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99588 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

JR`4TOjBPJVLk-qU=u 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 diff --git a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/transmission_gate.py b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/transmission_gate.py index 58a87c3be..bedfb3fa4 100755 --- a/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/transmission_gate.py +++ b/openfasoc/generators/glayout/glayout/flow/blocks/transmission_gate_saltychip/transmission_gate.py @@ -17,13 +17,30 @@ from glayout.flow.placement.common_centroid_ab_ba import common_centroid_ab_ba from glayout.flow.pdk.util.comp_utils import prec_ref_center, movey, evaluate_bbox, align_comp_to_port from glayout.flow.primitives.via_gen import via_stack +from gdsfactory.cell import cell +from glayout.flow.spice import Netlist +from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid # My own cell library from reconfig_inv import reconfig_inv import comp_dc -#@cell -def short_channel_tg( +def tg_netlist(pmos: Component, nmos: Component) -> Netlist: + # A: tg.input, i.e. PMOS & NMOS source + # Y: tg.output, i.e. PMOS & NMOS drain + # C: connected to tg.nmos.gate + # CBAR: connected to tg.pmos.gate + # VDD: connected to tg.pmos.body + # VSS: connected to tg.nmos.body + netlist = Netlist(circuit_name='tg', nodes=['VDD', 'VSS', 'A', 'Y', 'C', 'CBAR']) + #netlist.connect_netlist(pmos.info['netlist'], [('D', 'Y'), ('G', 'CBAR'), ('S', 'A'), ('PB', 'VDD')]) + #netlist.connect_netlist(nmos.info['netlist'], [('D', 'Y'), ('G', 'C'), ('S', 'A'), ('NB', 'VSS')]) + netlist.connect_netlist(pmos.info['netlist'], [('D', 'Y'), ('G', 'CBAR'), ('S', 'A')]) + netlist.connect_netlist(nmos.info['netlist'], [('D', 'Y'), ('G', 'C'), ('S', 'A')]) + return netlist + +@cell +def short_width_tg( pdk: MappedPDK, component_name: str, orientation_config: @@ -35,6 +52,7 @@ def short_channel_tg( add_pin: bool = True, # For LVS **kwargs ) -> Component: + # To prepare all necessary cells to construct a transmission gate, i.e. # 1) PMOS # 2) NMOS @@ -96,14 +114,15 @@ def short_channel_tg( comp_ref = align_comp_to_port(comp, prt, alignment=alignment) top_level.add(comp_ref) - return top_level + component = component_snap_to_grid(rename_ports_by_orientation(top_level)) + component.info['netlist'] = tg_netlist(pmos=pfet, nmos=nfet) + return component + -#@cell -def long_channel_tg( +@cell +def long_width_tg( pdk: MappedPDK, component_name: str, - orientation_config: - dict[str, Union[int, str]], pmos_width, pmos_length, nmos_width, @@ -112,111 +131,94 @@ def long_channel_tg( **kwargs ) -> Component: # To calculate the number of fingers for the underlying PMOS/NMOS layout - finger_num = math.ceil(pmos_width / comp_dc.tg_channel_width_base) - mos_width = comp_dc.tg_channel_width_base + finger_num = math.ceil(pmos_width / comp_dc.tg_fet_width_base) + mos_width = comp_dc.tg_fet_width_base # To prepare all necessary cells to construct a transmission gate, i.e. # 1) PMOS # 2) NMOS pfet = pmos(pdk=pdk, multipliers=1, fingers=finger_num, interfinger_rmult=3, gate_rmult=1, with_tie=False, with_substrate_tap=False, with_dummy=(False, False), width=mos_width, length=pmos_length) nfet = nmos(pdk=pdk, multipliers=1, fingers=finger_num, interfinger_rmult=3, gate_rmult=1, with_tie=False, with_dnwell=False, with_substrate_tap=False, with_dummy=(False, False), width=mos_width, length=nmos_length) - - # Placement and adding ports top_level = Component(name=component_name) pfet_ref = prec_ref_center(pfet) nfet_ref = prec_ref_center(nfet) top_level.add(pfet_ref) top_level.add(nfet_ref) - # Placement + # Placement.step_1: + # a) To vertically flip the NMOS such that the its gate point toward the PMOS's gate + # b) To move the PMOS above the NMOS mos_spacing = pdk.util_max_metal_seperation() - #if orientation_config["pmos_degree"] != None: - # pfet_ref.rotate(orientation_config["pmos_degree"]) - #if orientation_config["nmos_degree"] != None: - # nfet_ref.rotate(orientation_config["nmos_degree"]) - rename_ports_by_orientation(nfet_ref.mirror_y()) # To vertically flip the NMOS such that the its gate point toward the PMOS's gate + rename_ports_by_orientation(nfet_ref.mirror_y()) # pfet_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing) + # Placement.step_2: instantiation of the stacked vias to the source of every PMOS's finger + fet_source_finger_num = math.ceil((finger_num+1) / 2) + fet_drain_finger_num = finger_num+1-fet_source_finger_num + fet_source_fingerL_num = (fet_source_finger_num-1)/2 # excluding the centered one + fet_drain_fingerL_num = fet_drain_finger_num/2 + finger_col_num = fet_source_finger_num # A half of the fingers belongs to drain + finger_row_num = math.floor((mos_width*0.5) / (2*pdk.get_grule("met2")["min_width"]))-1 # To pave the stacked vias over all bottom half + print(f"finger_row_num: {finger_row_num}, finger_col_num: {finger_col_num}") + pmos_source_sdvias = list() + nmos_source_sdvias = list() + pmos_source_sdvias_ref = list() + nmos_source_sdvias_ref = list() + sdvias_row = [via_stack(pdk=pdk, glayer1="met2", glayer2="met3", fullbottom=True, fulltop=True) for i in range(finger_col_num)] + for row in range(finger_row_num): + pmos_source_sdvias.append(sdvias_row) + nmos_source_sdvias.append(sdvias_row) + + pmos_temp_ref = list() + nmos_temp_ref = list() + for col in range(finger_col_num): + temp_ref = prec_ref_center(pmos_source_sdvias[row][col]) + pmos_temp_ref.append(temp_ref) + temp_ref = prec_ref_center(nmos_source_sdvias[row][col]) + nmos_temp_ref.append(temp_ref) + + pmos_source_sdvias_ref.append(pmos_temp_ref) + nmos_source_sdvias_ref.append(nmos_temp_ref) + top_level.add(pmos_source_sdvias_ref[row][col] for col in range(finger_col_num)) + top_level.add(nmos_source_sdvias_ref[row][col] for col in range(finger_col_num)) + + # Placement.step_3: moving the all the stacked vias associated with the PMOS's source such that + # they are connected to the PMOS's source + centroid_index = math.floor(fet_source_finger_num/2) + y_offset = pdk.get_grule("met3")["min_separation"]+pdk.get_grule("met3")["min_width"] + x_s2d_offset = abs(pfet_ref.ports["multiplier_0_leftsd_array_row0_col0_bottom_via_S"].center[0]-pfet_ref.ports["multiplier_0_row0_col0_rightsd_array_row0_col0_bottom_via_S"].center[0]) + x_offset = x_s2d_offset*2 # Distance between one soure finger to another source finger at its left-/right-hand side is (S-to-D distance)*2 + for row in range(finger_row_num): + x_spacing = x_offset*centroid_index # initial value + for col in range(finger_col_num): + # Moving the positions of the stacked vias associated with the PMOS + pmos_source_sdvias_ref[row][col].movey(evaluate_bbox(nfet)[1]+mos_spacing-(y_offset*row)) + pmos_source_sdvias_ref[row][col].movex(x_spacing) + + # Moving the positions fo the stacked vias associated with NMOS + nmos_source_sdvias_ref[row][col].movey(y_offset*row) # In NMOS, the row_0 is exactly placed at the center position (0, 0), + # thereby no need for moving the stacked vias of row_0, i.e. movey by 0 + nmos_source_sdvias_ref[row][col].movex(x_spacing) + + x_spacing = x_spacing-x_offset - pmos_drain_viaStack = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - pmos_drain_viaStack1 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - pmos_drain_viaStack2 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - pmos_drain_viaStack3 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - pmos_drain_viaStack4 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - pmos_drain_viaStack5 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - - nmos_drain_viaStack = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - nmos_drain_viaStack1 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - nmos_drain_viaStack2 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - nmos_drain_viaStack3 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - nmos_drain_viaStack4 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - nmos_drain_viaStack5 = via_stack(pdk=pdk, glayer1="met2", glayer2="met3") - - pmos_drain_viaStack_ref = prec_ref_center(pmos_drain_viaStack) - pmos_drain_viaStack1_ref = prec_ref_center(pmos_drain_viaStack1) - pmos_drain_viaStack2_ref = prec_ref_center(pmos_drain_viaStack2) - pmos_drain_viaStack3_ref = prec_ref_center(pmos_drain_viaStack3) - pmos_drain_viaStack4_ref = prec_ref_center(pmos_drain_viaStack4) - pmos_drain_viaStack5_ref = prec_ref_center(pmos_drain_viaStack5) - nmos_drain_viaStack_ref = prec_ref_center(nmos_drain_viaStack) - nmos_drain_viaStack1_ref = prec_ref_center(nmos_drain_viaStack1) - nmos_drain_viaStack2_ref = prec_ref_center(nmos_drain_viaStack2) - nmos_drain_viaStack3_ref = prec_ref_center(nmos_drain_viaStack3) - nmos_drain_viaStack4_ref = prec_ref_center(nmos_drain_viaStack4) - nmos_drain_viaStack5_ref = prec_ref_center(nmos_drain_viaStack5) - top_level.add(pmos_drain_viaStack_ref) - top_level.add(pmos_drain_viaStack1_ref) - top_level.add(pmos_drain_viaStack2_ref) - top_level.add(pmos_drain_viaStack3_ref) - top_level.add(pmos_drain_viaStack4_ref) - top_level.add(pmos_drain_viaStack5_ref) - top_level.add(nmos_drain_viaStack_ref) - top_level.add(nmos_drain_viaStack1_ref) - top_level.add(nmos_drain_viaStack2_ref) - top_level.add(nmos_drain_viaStack3_ref) - top_level.add(nmos_drain_viaStack4_ref) - top_level.add(nmos_drain_viaStack5_ref) - - pmos_drain_viaStack_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing) - pmos_drain_viaStack1_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing) - pmos_drain_viaStack2_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing) - pmos_drain_viaStack3_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing - pdk.get_grule("met3")["min_separation"] - pdk.get_grule("met3")["min_width"]) - pmos_drain_viaStack4_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing - pdk.get_grule("met3")["min_separation"] - pdk.get_grule("met3")["min_width"]) - pmos_drain_viaStack5_ref.movey(evaluate_bbox(nfet)[1] + mos_spacing - pdk.get_grule("met3")["min_separation"] - pdk.get_grule("met3")["min_width"]) - nmos_drain_viaStack3_ref.movey(pdk.get_grule("met3")["min_separation"]+pdk.get_grule("met3")["min_width"]) - nmos_drain_viaStack4_ref.movey(pdk.get_grule("met3")["min_separation"]+pdk.get_grule("met3")["min_width"]) - nmos_drain_viaStack5_ref.movey(pdk.get_grule("met3")["min_separation"]+pdk.get_grule("met3")["min_width"]) - pmos_drain_viaStack1_ref.movex(pfet_ref.ports["source_W"].center[0]+0.15) - pmos_drain_viaStack2_ref.movex(-pfet_ref.ports["source_W"].center[0]-0.15) - pmos_drain_viaStack4_ref.movex(pfet_ref.ports["source_W"].center[0]+0.15) - pmos_drain_viaStack5_ref.movex(-pfet_ref.ports["source_W"].center[0]-0.15) - nmos_drain_viaStack1_ref.movex(pfet_ref.ports["source_W"].center[0]+0.15) - nmos_drain_viaStack2_ref.movex(-pfet_ref.ports["source_W"].center[0]-0.15) - nmos_drain_viaStack4_ref.movex(pfet_ref.ports["source_W"].center[0]+0.15) - nmos_drain_viaStack5_ref.movex(-pfet_ref.ports["source_W"].center[0]-0.15) - - c = Component() - c.add_polygon( + # Routing + # To simplify the routing for the parallel-gate transistors, the layout is realised as follow which is expected to be equivalent to a TG + # a) PMOS.source connected to NMOS.source by placing a large MET2-layered rectangle + # b) PMOS.drain connected to NMOS.drain + source_connection = Component() + source_connection.add_polygon( [ - (nmos_drain_viaStack1_ref.xmin, nmos_drain_viaStack1_ref.ymin),#leftBottom_pos - (nmos_drain_viaStack2_ref.xmax, nmos_drain_viaStack2_ref.ymin),#rightBottom_pos - (pmos_drain_viaStack2_ref.xmax, pmos_drain_viaStack2_ref.ymax),#rightTop_pos - (pmos_drain_viaStack1_ref.xmin, pmos_drain_viaStack1_ref.ymax) #leftTop_pos + (nmos_source_sdvias_ref[0][finger_col_num-1].xmin, nmos_source_sdvias_ref[0][finger_col_num-1].ymin),#leftBottom_pos + (pmos_source_sdvias_ref[0][finger_col_num-1].xmin, pmos_source_sdvias_ref[0][finger_col_num-1].ymax),#leftTop_pos + (pmos_source_sdvias_ref[0][0].xmax, pmos_source_sdvias_ref[0][0].ymax),#rightTop_pos + (nmos_source_sdvias_ref[0][0].xmax, nmos_source_sdvias_ref[0][0].ymin) #rightBottom_pos ], layer=pdk.get_glayer("met3") ) - c_ref = top_level.add_ref(c) - - # Routing - # To simplify the routing for the parallel-gate transistors, the layout is realised as follow which is expected to be equivalent to a TG - # a) PMOS.source connected to NMOS.source - # b) PMOS.drain connected to NMOS.drain + source_connection = top_level.add_ref(source_connection) top_level << c_route(pdk, pfet_ref.ports["drain_E"], nfet_ref.ports["drain_E"], cglayer="met3") # "out" of the TG - #top_level << straight_route(pdk, pmos_drain_viaStack_ref.ports["top_met_S"], nmos_drain_viaStack_ref.ports["top_met_S"])#, glayer1="met3") - #top_level << straight_route(pdk, pmos_drain_viaStack1_ref.ports["top_met_S"], nmos_drain_viaStack1_ref.ports["top_met_S"]) - #top_level << straight_route(pdk, pmos_drain_viaStack2_ref.ports["top_met_S"], nmos_drain_viaStack2_ref.ports["top_met_S"]) - # Add the ports aligned with the basic PMOS and NMOS top_level.add_ports(pfet_ref.get_ports_list(), prefix="pmos_") top_level.add_ports(nfet_ref.get_ports_list(), prefix="nmos_") @@ -250,104 +252,11 @@ def long_channel_tg( alignment = ('c', 'b') if alignment is None else alignment comp_ref = align_comp_to_port(comp, prt, alignment=alignment) top_level.add(comp_ref) - - return top_level - -#@cell -def tg_with_ctrl( - pdk: MappedPDK, - component_name: str, - pmos_width, - pmos_length, - nmos_width, - nmos_length, - add_pin: bool = True, # For LVS - **kwargs -) -> Component: - # To prepare all necessary cells to construct a transmission gate, i.e. - # 1) transmission gate - # 2) Inverter - tg = tg_cell( - pdk=pdk, - component_name="tg", - orientation_config={"degree": 270}, - pmos_width=pmos_width, - pmos_length=pmos_length, - nmos_width=nmos_width, - nmos_length=nmos_length, - add_pin=False - ) - inv = reconfig_inv( - pdk=pdk, - component_name="gate_ctrl_inv", - pmos_width=pmos_width, - pmos_length=pmos_length, - nmos_width=nmos_width, - nmos_length=nmos_length, - orientation="horizontal", - add_pin=False - ) - - # Instantiation of the essential cells - top_level = Component(name=component_name) - tg_ref = prec_ref_center(tg) - inv_ref = prec_ref_center(inv) - top_level.add(tg_ref) - top_level.add(inv_ref) - - # Placement - mos_spacing = pdk.util_max_metal_seperation() - nwell_min_spacing = pdk.get_grule("nwell")["min_separation"] - inv_cell_width = inv_ref.xsize # or = evaluate_bbox(inv)[0] - tg_ref.movex(inv_cell_width + nwell_min_spacing) - - # Routing - # 1) PMOS of the TG is switched on/off by the inverter's output - # 2) NMOS of the TG is switched on/off by an external control signal connected to inverter's input port as well - top_level << smart_route(pdk, inv_ref.ports["pmos_multiplier_0_drain_E"], tg_ref.ports["pmos_multiplier_0_gate_W"]) - top_level << straight_route(pdk, inv_ref.ports["nmos_multiplier_0_gate_S"], tg_ref.ports["nmos_multiplier_0_gate_S"], glayer1="met3") - - # Adding the ports - top_level.add_ports(tg_ref.get_ports_list(), prefix="tg_") - top_level.add_ports(inv_ref.get_ports_list(), prefix="inv_") - if add_pin == True: - # Add pins w/ labels for LVS - top_level.unlock() - pin_info = list() # list that contains all port and component information - met1_pin=(pdk.get_glayer("met1")[0], 20) - met1_label=(pdk.get_glayer("met1")[0], 5) - port_size = (0.24, 0.24) - # --- Port: A, i.e. input of the transmission gate - A_pin=rectangle(layer=met1_pin, size=port_size, centered=True).copy() - A_pin.add_label(text="A", layer=met1_label) - pin_info.append((A_pin, top_level.ports.get(f"tg_nmos_drain_S"), None)) - # --- Port: Y, i.e. output of the transmission gate - Y_pin=rectangle(layer=met1_pin, size=port_size, centered=True).copy() - Y_pin.add_label(text="Y", layer=met1_label) - pin_info.append((Y_pin, top_level.ports.get(f"tg_pmos_drain_S"), None)) - # --- Port: C, i.e. gate control to the NMOS - C_pin=rectangle(layer=met1_pin, size=port_size, centered=True).copy() - C_pin.add_label(text="C", layer=met1_label) - pin_info.append((C_pin, top_level.ports.get(f"inv_nmos_gate_N"), None)) - # --- Port: VDD - VDD_pin=rectangle(layer=met1_pin, size=port_size, centered=True).copy() - VDD_pin.add_label(text="VDD", layer=met1_label) - pin_info.append((VDD_pin, top_level.ports.get(f"inv_pmos_drain_E"), None)) - # --- Port: VSS - VSS_pin=rectangle(layer=met1_pin, size=port_size, centered=True).copy() - VSS_pin.add_label(text="VSS", layer=met1_label) - pin_info.append((VSS_pin, top_level.ports.get(f"inv_nmos_source_W"), ('r', 't'))) - - # Move everythin to position - for comp, prt, alignment in pin_info: - alignment = ('c', 'b') if alignment is None else alignment - comp_ref = align_comp_to_port(comp, prt, alignment=alignment) - top_level.add(comp_ref) - - return top_level + component = component_snap_to_grid(rename_ports_by_orientation(top_level)) + component.info['netlist'] = tg_netlist(pmos=pfet, nmos=nfet) + return component -#@cell def reconfig_tg( pdk: MappedPDK, component_name, @@ -360,19 +269,20 @@ def reconfig_tg( ) -> Component: if pmos_width != nmos_width: raise ValueError("PCell constraint: the widths of PMOS and NMOS must be identical") - elif pmos_width >= comp_dc.tg_channel_width_base: # Long-channel PMOS and NMOS - tg = long_channel_tg( + elif (pmos_width % comp_dc.tg_fet_width_factor) != 0: + raise ValueError(f"PCell constraint: the widths of PMOS and NMOS must be multiple of {comp_dc.tg_fet_width_factor} (the given width: {pmos_width})") + elif pmos_width >= comp_dc.tg_fet_width_base: # Long-width PMOS and NMOS + tg = long_width_tg( pdk=pdk, component_name=component_name, - orientation_config={"nmos_degree": 180, "pmos_degree": 0}, pmos_width=pmos_width, pmos_length=pmos_length, nmos_width=nmos_width, nmos_length=nmos_length, add_pin=True ) - else: # Short-channel PMOS and NMOS - tg = short_channel_tg( + else: # Short-width PMOS and NMOS + tg = short_width_tg( pdk=pdk, component_name=component_name, orientation_config={"degree": 270},