From 23c0bf89265ca24c838c713fb7b3753c2e76ef92 Mon Sep 17 00:00:00 2001 From: Aditya Kak Date: Sun, 25 Jan 2026 20:03:18 +0000 Subject: [PATCH 1/5] fixed netlist issue in elementary Pcells --- src/glayout/blocks/ATLAS/current_mirror.py | 26 +-- src/glayout/blocks/ATLAS/debug_netlist.py | 72 ------- src/glayout/blocks/ATLAS/debug_sample_11.py | 81 ------- src/glayout/blocks/ATLAS/diff_pair.py | 26 +-- src/glayout/blocks/ATLAS/evaluator_wrapper.py | 2 +- src/glayout/blocks/ATLAS/fvf.py | 34 +-- src/glayout/blocks/ATLAS/lvcm.py | 36 ++-- src/glayout/blocks/ATLAS/opamp.py | 22 +- src/glayout/blocks/ATLAS/resume_fvf_nohup.py | 39 ---- .../blocks/ATLAS/robust_verification.py | 70 +++---- src/glayout/blocks/ATLAS/run_lhs_files.py | 98 --------- .../blocks/ATLAS/test_comprehensive_fix.py | 180 ---------------- src/glayout/blocks/ATLAS/test_lvs_fix.py | 198 ------------------ src/glayout/blocks/ATLAS/test_netlist_fix.py | 87 -------- src/glayout/blocks/ATLAS/transmission_gate.py | 67 +++--- 15 files changed, 131 insertions(+), 907 deletions(-) delete mode 100644 src/glayout/blocks/ATLAS/debug_netlist.py delete mode 100644 src/glayout/blocks/ATLAS/debug_sample_11.py delete mode 100755 src/glayout/blocks/ATLAS/resume_fvf_nohup.py delete mode 100644 src/glayout/blocks/ATLAS/run_lhs_files.py delete mode 100644 src/glayout/blocks/ATLAS/test_comprehensive_fix.py delete mode 100644 src/glayout/blocks/ATLAS/test_lvs_fix.py delete mode 100644 src/glayout/blocks/ATLAS/test_netlist_fix.py diff --git a/src/glayout/blocks/ATLAS/current_mirror.py b/src/glayout/blocks/ATLAS/current_mirror.py index 3d7bf11f..6097dcb7 100644 --- a/src/glayout/blocks/ATLAS/current_mirror.py +++ b/src/glayout/blocks/ATLAS/current_mirror.py @@ -1,19 +1,19 @@ -from glayout.flow.placement.two_transistor_interdigitized import two_nfet_interdigitized, two_pfet_interdigitized -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.spice.netlist import Netlist -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk as sky130 -from glayout.flow.primitives.fet import nmos, pmos -from glayout.flow.primitives.guardring import tapring -from glayout.flow.pdk.util.port_utils import add_ports_perimeter,rename_ports_by_orientation +from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized, two_pfet_interdigitized +from glayout.pdk.mappedpdk import MappedPDK +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.routing.straight_route import straight_route +from glayout.spice.netlist import Netlist +from glayout.pdk.sky130_mapped import sky130_mapped_pdk as sky130 +from glayout.primitives.fet import nmos, pmos +from glayout.primitives.guardring import tapring +from glayout.util.port_utils import add_ports_perimeter, rename_ports_by_orientation from gdsfactory.component import Component from gdsfactory.cell import cell -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port +from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port from typing import Optional, Union -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk -from glayout.flow.primitives.via_gen import via_stack +from glayout.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle try: diff --git a/src/glayout/blocks/ATLAS/debug_netlist.py b/src/glayout/blocks/ATLAS/debug_netlist.py deleted file mode 100644 index 05e322f7..00000000 --- a/src/glayout/blocks/ATLAS/debug_netlist.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -""" -Debug script to investigate the netlist reconstruction issue. -""" - -import sys -import os - -# Add the glayout path -glayout_path = "/home/arnavshukla/OpenFASOC/openfasoc/generators/glayout" -if glayout_path not in sys.path: - sys.path.insert(0, glayout_path) - -# Set up environment -os.environ['PDK_ROOT'] = '/opt/conda/envs/GLdev/share/pdk' -os.environ['PDK'] = 'sky130A' - -def debug_netlist_storage(): - """Debug what's actually being stored in component.info""" - print("๐Ÿ” Debugging Netlist Storage...") - - from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk - from transmission_gate import transmission_gate - - pdk = sky130_mapped_pdk - - print("๐Ÿ“‹ Creating transmission gate...") - tg = transmission_gate(pdk=pdk, width=(1.0, 2.0), length=(0.15, 0.15)) - - print("\n๐Ÿ“Š Component Info Contents:") - print("Keys:", list(tg.info.keys())) - - for key, value in tg.info.items(): - print(f"\n{key}: {type(value)}") - if isinstance(value, str): - print(f" Length: {len(value)}") - print(f" Preview: {value[:100]}...") - elif isinstance(value, dict): - print(f" Dict keys: {list(value.keys())}") - for k, v in value.items(): - print(f" {k}: {type(v)} - {str(v)[:50]}...") - - # Test reconstruction - print("\n๐Ÿ”ง Testing Reconstruction...") - if 'netlist_data' in tg.info: - from glayout.flow.spice.netlist import Netlist - data = tg.info['netlist_data'] - print(f"Netlist data: {data}") - - try: - netlist_obj = Netlist( - circuit_name=data['circuit_name'], - nodes=data['nodes'] - ) - netlist_obj.source_netlist = data['source_netlist'] - - print(f"Reconstructed netlist object: {netlist_obj}") - print(f"Circuit name: {netlist_obj.circuit_name}") - print(f"Nodes: {netlist_obj.nodes}") - print(f"Source netlist: {netlist_obj.source_netlist}") - - generated = netlist_obj.generate_netlist() - print(f"Generated netlist length: {len(generated)}") - print(f"Generated content:\n{generated}") - - except Exception as e: - print(f"Error reconstructing: {e}") - import traceback - traceback.print_exc() - -if __name__ == "__main__": - debug_netlist_storage() diff --git a/src/glayout/blocks/ATLAS/debug_sample_11.py b/src/glayout/blocks/ATLAS/debug_sample_11.py deleted file mode 100644 index 1dd3c00b..00000000 --- a/src/glayout/blocks/ATLAS/debug_sample_11.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python3 -""" -Debug script for sample 11 that was hanging -""" - -import sys -import time -import json -from pathlib import Path - -# Add glayout to path -_here = Path(__file__).resolve() -_root_dir = _here.parent.parent.parent.parent.parent -sys.path.insert(0, str(_root_dir)) - -from glayout.flow.blocks.elementary.LHS.transmission_gate import transmission_gate, add_tg_labels -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk - -def test_sample_11(): - """Test the specific parameters that are causing sample 11 to hang""" - - # Sample 11 parameters (index 10) - params = { - "width": [15.56987768790995, 19.431313875884364], - "length": [2.2925198967864566, 0.8947369421533957], - "fingers": [5, 5], - "multipliers": [2, 2] - } - - print("Testing sample 11 parameters:") - print(f"Parameters: {params}") - - # Convert to tuples - width_tuple = tuple(params['width']) - length_tuple = tuple(params['length']) - fingers_tuple = tuple(params['fingers']) - multipliers_tuple = tuple(params['multipliers']) - - print(f"Width tuple: {width_tuple}") - print(f"Length tuple: {length_tuple}") - print(f"Fingers tuple: {fingers_tuple}") - print(f"Multipliers tuple: {multipliers_tuple}") - - try: - print("Creating transmission gate...") - start_time = time.time() - - tg_component = transmission_gate( - pdk=sky130_mapped_pdk, - width=width_tuple, - length=length_tuple, - fingers=fingers_tuple, - multipliers=multipliers_tuple, - substrate_tap=True - ) - - creation_time = time.time() - start_time - print(f"โœ… Transmission gate created in {creation_time:.2f}s") - - print("Adding labels...") - start_time = time.time() - cell = add_tg_labels(tg_component, sky130_mapped_pdk) - cell.name = "test_sample_11" - label_time = time.time() - start_time - print(f"โœ… Labels added in {label_time:.2f}s") - - print("Writing GDS...") - start_time = time.time() - cell.write_gds("test_sample_11.gds") - gds_time = time.time() - start_time - print(f"โœ… GDS written in {gds_time:.2f}s") - - print("๐ŸŽ‰ Sample 11 test completed successfully!") - - except Exception as e: - print(f"โŒ Error: {e}") - import traceback - traceback.print_exc() - -if __name__ == "__main__": - test_sample_11() \ No newline at end of file diff --git a/src/glayout/blocks/ATLAS/diff_pair.py b/src/glayout/blocks/ATLAS/diff_pair.py index 116a58cd..8c3221a7 100644 --- a/src/glayout/blocks/ATLAS/diff_pair.py +++ b/src/glayout/blocks/ATLAS/diff_pair.py @@ -5,9 +5,9 @@ from gdsfactory.components.rectangle import rectangle from gdsfactory.routing.route_quad import route_quad from gdsfactory.routing.route_sharp import route_sharp -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.util.comp_utils import align_comp_to_port, evaluate_bbox, movex, movey -from glayout.flow.pdk.util.port_utils import ( +from glayout.pdk.mappedpdk import MappedPDK +from glayout.util.comp_utils import align_comp_to_port, evaluate_bbox, movex, movey +from glayout.util.port_utils import ( add_ports_perimeter, get_orientation, print_ports, @@ -15,16 +15,16 @@ rename_ports_by_orientation, set_port_orientation, ) -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.placement.common_centroid_ab_ba import common_centroid_ab_ba -from glayout.flow.primitives.fet import nmos, pmos -from glayout.flow.primitives.guardring import tapring -from glayout.flow.primitives.via_gen import via_stack -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.smart_route import smart_route -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.spice import Netlist -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.placement.common_centroid_ab_ba import common_centroid_ab_ba +from glayout.primitives.fet import nmos, pmos +from glayout.primitives.guardring import tapring +from glayout.primitives.via_gen import via_stack +from glayout.routing.c_route import c_route +from glayout.routing.smart_route import smart_route +from glayout.routing.straight_route import straight_route +from glayout.spice import Netlist +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.components import text_freetype try: from evaluator_wrapper import run_evaluation diff --git a/src/glayout/blocks/ATLAS/evaluator_wrapper.py b/src/glayout/blocks/ATLAS/evaluator_wrapper.py index d378794a..cda1c13f 100644 --- a/src/glayout/blocks/ATLAS/evaluator_wrapper.py +++ b/src/glayout/blocks/ATLAS/evaluator_wrapper.py @@ -8,7 +8,7 @@ from gdsfactory.typings import Component from robust_verification import run_robust_verification -from glayout.flow.blocks.evaluator_box.physical_features import run_physical_feature_extraction +from glayout.blocks.evaluator_box.physical_features import run_physical_feature_extraction def get_next_filename(base_name="evaluation", extension=".json"): """ diff --git a/src/glayout/blocks/ATLAS/fvf.py b/src/glayout/blocks/ATLAS/fvf.py index 106a932d..8ef53c46 100644 --- a/src/glayout/blocks/ATLAS/fvf.py +++ b/src/glayout/blocks/ATLAS/fvf.py @@ -1,25 +1,25 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.cell import cell from gdsfactory.component import Component from gdsfactory import Component -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.primitives.guardring import tapring -from glayout.flow.pdk.util.port_utils import add_ports_perimeter -from glayout.flow.spice.netlist import Netlist -from glayout.flow.primitives.via_gen import via_stack +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.primitives.guardring import tapring +from glayout.util.port_utils import add_ports_perimeter +from glayout.spice.netlist import Netlist +from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle from evaluator_wrapper import run_evaluation # CUSTOM IMPLEMENTED EVAL BOX def get_component_netlist(component): """Helper function to get netlist object from component info, compatible with all gdsfactory versions""" - from glayout.flow.spice.netlist import Netlist + from glayout.spice.netlist import Netlist # Try to get stored object first (for older gdsfactory versions) if 'netlist_obj' in component.info: @@ -183,10 +183,12 @@ def flipped_voltage_follower( component = component_snap_to_grid(rename_ports_by_orientation(top_level)) #component = rename_ports_by_orientation(top_level) - # Store netlist as string to avoid gymnasium info dict type restrictions + # Store netlist as string for LVS (avoids gymnasium info dict type restrictions) # Compatible with both gdsfactory 7.7.0 and 7.16.0+ strict Pydantic validation netlist_obj = fvf_netlist(fet_1, fet_2) - component.info['netlist'] = str(netlist_obj) + component.info['netlist'] = netlist_obj.generate_netlist() + # Store the Netlist object for hierarchical netlist building (used by lvcm.py etc.) + component.info['netlist_obj'] = netlist_obj # Store serialized netlist data for reconstruction if needed component.info['netlist_data'] = { 'circuit_name': netlist_obj.circuit_name, diff --git a/src/glayout/blocks/ATLAS/lvcm.py b/src/glayout/blocks/ATLAS/lvcm.py index 9e85ec6b..9bfb6091 100644 --- a/src/glayout/blocks/ATLAS/lvcm.py +++ b/src/glayout/blocks/ATLAS/lvcm.py @@ -1,22 +1,22 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.component import Component from gdsfactory.component_reference import ComponentReference from gdsfactory.cell import cell from gdsfactory import Component from gdsfactory.components import text_freetype, rectangle -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, prec_ref_center -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.primitives.guardring import tapring -from glayout.flow.pdk.util.port_utils import add_ports_perimeter -from glayout.flow.spice.netlist import Netlist -from glayout.flow.blocks.elementary.LHS.fvf import fvf_netlist, flipped_voltage_follower -from glayout.flow.primitives.via_gen import via_stack +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, prec_ref_center +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.primitives.guardring import tapring +from glayout.util.port_utils import add_ports_perimeter +from glayout.spice.netlist import Netlist +from fvf import fvf_netlist, flipped_voltage_follower # Import from local ATLAS fvf.py +from glayout.primitives.via_gen import via_stack from typing import Optional from evaluator_wrapper import run_evaluation @@ -67,8 +67,9 @@ def add_lvcm_labels(lvcm_in: Component, def low_voltage_cmirr_netlist(bias_fvf: Component, cascode_fvf: Component, fet_1_ref: ComponentReference, fet_2_ref: ComponentReference, fet_3_ref: ComponentReference, fet_4_ref: ComponentReference) -> Netlist: netlist = Netlist(circuit_name='Low_voltage_current_mirror', nodes=['IBIAS1', 'IBIAS2', 'GND', 'IOUT1', 'IOUT2']) - netlist.connect_netlist(bias_fvf.info['netlist'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib','IBIAS1'),('VOUT','local_net_1')]) - netlist.connect_netlist(cascode_fvf.info['netlist'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib', 'IBIAS2'),('VOUT','local_net_2')]) + # Use netlist_obj for hierarchical netlist building + netlist.connect_netlist(bias_fvf.info['netlist_obj'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib','IBIAS1'),('VOUT','local_net_1')]) + netlist.connect_netlist(cascode_fvf.info['netlist_obj'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib', 'IBIAS2'),('VOUT','local_net_2')]) fet_1A_ref=netlist.connect_netlist(fet_2_ref.info['netlist'], [('D', 'IOUT1'),('G','IBIAS1'),('B','GND')]) fet_2A_ref=netlist.connect_netlist(fet_4_ref.info['netlist'], [('D', 'IOUT2'),('G','IBIAS1'),('B','GND')]) fet_1B_ref=netlist.connect_netlist(fet_1_ref.info['netlist'], [('G','IBIAS2'),('S', 'GND'),('B','GND')]) @@ -184,7 +185,8 @@ def low_voltage_cmirror( top_level.add_ports(fet_4_ref.get_ports_list(), prefix="M_4_A_") component = component_snap_to_grid(rename_ports_by_orientation(top_level)) - component.info['netlist'] = low_voltage_cmirr_netlist(bias_fvf, cascode_fvf, fet_1_ref, fet_2_ref, fet_3_ref, fet_4_ref) + netlist_obj = low_voltage_cmirr_netlist(bias_fvf, cascode_fvf, fet_1_ref, fet_2_ref, fet_3_ref, fet_4_ref) + component.info['netlist'] = netlist_obj.generate_netlist() return component diff --git a/src/glayout/blocks/ATLAS/opamp.py b/src/glayout/blocks/ATLAS/opamp.py index d5b25690..17b54962 100644 --- a/src/glayout/blocks/ATLAS/opamp.py +++ b/src/glayout/blocks/ATLAS/opamp.py @@ -1,18 +1,18 @@ from gdsfactory.read.import_gds import import_gds from gdsfactory.components import text_freetype, rectangle -from glayout.flow.pdk.util.comp_utils import prec_array, movey, align_comp_to_port, prec_ref_center -from glayout.flow.pdk.util.port_utils import add_ports_perimeter, print_ports +from glayout.util.comp_utils import prec_array, movey, align_comp_to_port, prec_ref_center +from glayout.util.port_utils import add_ports_perimeter, print_ports from gdsfactory.component import Component -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.blocks.composite.opamp.opamp import opamp -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.primitives.via_gen import via_array +from glayout.pdk.mappedpdk import MappedPDK +from glayout.blocks.composite.opamp.opamp import opamp +from glayout.routing.L_route import L_route +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.primitives.via_gen import via_array from gdsfactory.cell import cell, clear_cache -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk as pdk -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.pdk.util.component_array_create import write_component_matrix +from glayout.pdk.sky130_mapped import sky130_mapped_pdk as pdk +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.util.component_array_create import write_component_matrix from evaluator_wrapper import run_evaluation def sky130_add_opamp_2_labels(opamp_in: Component) -> Component: """adds opamp labels for extraction, without adding pads diff --git a/src/glayout/blocks/ATLAS/resume_fvf_nohup.py b/src/glayout/blocks/ATLAS/resume_fvf_nohup.py deleted file mode 100755 index a192ff49..00000000 --- a/src/glayout/blocks/ATLAS/resume_fvf_nohup.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 -"""Resume the FVF generation non-interactively and exit with status. - -This script imports the updated generator and calls run_dataset_generation -directly. It's intended to be launched under nohup or a systemd service so it -continues after SSH disconnects. -""" -import logging -import sys - -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') -logger = logging.getLogger(__name__) - -try: - from generate_fvf_8h_runtime_aware import load_fvf_parameters, run_dataset_generation -except Exception as e: - logger.error(f"Failed to import generator module: {e}") - sys.exit(2) - - -def main(): - try: - params = load_fvf_parameters(None) - n = len(params) - logger.info(f"Resuming generation for {n} samples (checkpoint-aware)") - - # Run dataset generation; it will load and resume from checkpoint.json - success, passed, total = run_dataset_generation(n, "fvf_dataset_8h_runtime_aware", checkpoint_interval=100, resume_from_checkpoint=True) - - logger.info(f"Finished. success={success}, passed={passed}, total={total}") - return 0 if success else 1 - except Exception as e: - logger.exception(f"Unexpected error during resume: {e}") - return 3 - - -if __name__ == '__main__': - rc = main() - sys.exit(rc) diff --git a/src/glayout/blocks/ATLAS/robust_verification.py b/src/glayout/blocks/ATLAS/robust_verification.py index ea309be8..f90049af 100644 --- a/src/glayout/blocks/ATLAS/robust_verification.py +++ b/src/glayout/blocks/ATLAS/robust_verification.py @@ -272,24 +272,27 @@ def run_robust_verification(layout_path: str, component_name: str, top_level: Co # Import sky130_mapped_pdk *after* the environment is guaranteed sane so # that gdsfactory/PDK initialization picks up the correct PDK_ROOT. - from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk + from glayout.pdk.sky130_mapped import sky130_mapped_pdk # DRC Check - drc_report_path = os.path.abspath(f"./{component_name}.drc.rpt") + # drc_magic expects a directory and creates: {output_dir}/drc/{design_name}/{design_name}.rpt + drc_output_dir = os.path.abspath(".") + drc_report_path = os.path.join(drc_output_dir, "drc", component_name, f"{component_name}.rpt") verification_results["drc"]["report_path"] = drc_report_path try: - # Clean up any existing DRC report - if os.path.exists(drc_report_path): - os.remove(drc_report_path) + # Clean up any existing DRC report directory + drc_dir = os.path.join(drc_output_dir, "drc", component_name) + if os.path.exists(drc_dir): + shutil.rmtree(drc_dir) # Ensure PDK environment again right before DRC ensure_pdk_environment() print(f"Running DRC for {component_name}...") - # Try the PDK DRC method first - sky130_mapped_pdk.drc_magic(layout_path, component_name, output_file=drc_report_path) + # Pass directory as output_file, not the file path + sky130_mapped_pdk.drc_magic(layout_path, component_name, output_file=drc_output_dir) # Check if report was created and read it report_content = "" @@ -297,13 +300,9 @@ def run_robust_verification(layout_path: str, component_name: str, top_level: Co with open(drc_report_path, 'r') as f: report_content = f.read() print(f"DRC report created successfully: {len(report_content)} chars") - '''else: - print("Warning: DRC report file was not created, creating empty report") - # Create empty report as fallback - report_content = f"{component_name} count: \n----------------------------------------\n\n" - with open(drc_report_path, 'w') as f: - f.write(report_content) - ''' + else: + print(f"Warning: DRC report not found at {drc_report_path}") + summary = parse_drc_report(report_content) verification_results["drc"].update({ "summary": summary, @@ -313,35 +312,31 @@ def run_robust_verification(layout_path: str, component_name: str, top_level: Co except Exception as e: print(f"DRC failed with exception: {e}") - # Create a basic report even on failure - try: - with open(drc_report_path, 'w') as f: - f.write(f"DRC Error for {component_name}\n") - f.write(f"Error: {str(e)}\n") - verification_results["drc"]["status"] = f"error: {e}" - except: - verification_results["drc"]["status"] = f"error: {e}" + verification_results["drc"]["status"] = f"error: {e}" # Small delay between DRC and LVS import time time.sleep(1) # LVS Check - lvs_report_path = os.path.abspath(f"./{component_name}.lvs.rpt") + # lvs_netgen expects a directory and creates: {output_dir}/lvs/{design_name}/{design_name}_lvs.rpt + lvs_output_dir = os.path.abspath(".") + lvs_report_path = os.path.join(lvs_output_dir, "lvs", component_name, f"{component_name}_lvs.rpt") verification_results["lvs"]["report_path"] = lvs_report_path try: - # Clean up any existing LVS report - if os.path.exists(lvs_report_path): - os.remove(lvs_report_path) + # Clean up any existing LVS report directory + lvs_dir = os.path.join(lvs_output_dir, "lvs", component_name) + if os.path.exists(lvs_dir): + shutil.rmtree(lvs_dir) # Ensure PDK environment again right before LVS ensure_pdk_environment() print(f"Running LVS for {component_name}...") - # Try the PDK LVS method first - sky130_mapped_pdk.lvs_netgen(layout=top_level, design_name=component_name, output_file_path=lvs_report_path) + # Pass directory as output_file_path, not the file path + sky130_mapped_pdk.lvs_netgen(layout=top_level, design_name=component_name, output_file_path=lvs_output_dir) # Check if report was created and read it report_content = "" @@ -349,13 +344,9 @@ def run_robust_verification(layout_path: str, component_name: str, top_level: Co with open(lvs_report_path, 'r') as report_file: report_content = report_file.read() print(f"LVS report created successfully: {len(report_content)} chars") - '''else: - print("Warning: LVS report file was not created, creating fallback report") - # Create fallback report - report_content = f"LVS Report for {component_name}\nFinal result: Circuits match uniquely.\nLVS Done.\n" - with open(lvs_report_path, 'w') as f: - f.write(report_content) - ''' + else: + print(f"Warning: LVS report not found at {lvs_report_path}") + lvs_summary = parse_lvs_report(report_content) verification_results["lvs"].update({ "summary": lvs_summary, @@ -365,14 +356,7 @@ def run_robust_verification(layout_path: str, component_name: str, top_level: Co except Exception as e: print(f"LVS failed with exception: {e}") - # Create a basic report even on failure - try: - with open(lvs_report_path, 'w') as f: - f.write(f"LVS Error for {component_name}\n") - f.write(f"Error: {str(e)}\n") - verification_results["lvs"]["status"] = f"error: {e}" - except: - verification_results["lvs"]["status"] = f"error: {e}" + verification_results["lvs"]["status"] = f"error: {e}" # Small delay between LVS and PEX time.sleep(1) diff --git a/src/glayout/blocks/ATLAS/run_lhs_files.py b/src/glayout/blocks/ATLAS/run_lhs_files.py deleted file mode 100644 index 4a81cb2b..00000000 --- a/src/glayout/blocks/ATLAS/run_lhs_files.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -"""Run and time LHS generator files once and emit a JSON array of results. - -This script will attempt to execute the following files (located in the same -directory) once each and measure wall-clock time for the run: - -- current_mirror.py -- diff_pair.py -- fvf.py -- transmission_gate.py -- lvcm.py - -It records start/stop times, exit codes, elapsed seconds and any stderr output -into a JSON file named `run_lhs_results.json` and prints the JSON array to -stdout. -""" -import json -import os -import sys -import time -import subprocess - - -FILES = [ - "current_mirror.py", - "diff_pair.py", - "fvf.py", - "transmission_gate.py", - "lvcm.py", -] - - -def run_file(path, timeout=120): - """Run a python file and time the execution. Returns a dict with results.""" - start = time.perf_counter() - try: - completed = subprocess.run([sys.executable, path], capture_output=True, text=True, timeout=timeout) - end = time.perf_counter() - return { - "file": os.path.basename(path), - "elapsed_seconds": end - start, - "returncode": completed.returncode, - "stdout": completed.stdout.strip(), - "stderr": completed.stderr.strip(), - } - except subprocess.TimeoutExpired as e: - end = time.perf_counter() - return { - "file": os.path.basename(path), - "elapsed_seconds": end - start, - "returncode": None, - "stdout": "", - "stderr": f"Timeout after {timeout}s", - } - except Exception as e: - end = time.perf_counter() - return { - "file": os.path.basename(path), - "elapsed_seconds": end - start, - "returncode": None, - "stdout": "", - "stderr": f"Exception: {e}", - } - - -def main(): - base = os.path.dirname(os.path.abspath(__file__)) - results = [] - for fname in FILES: - fpath = os.path.join(base, fname) - if not os.path.exists(fpath): - results.append({ - "file": fname, - "elapsed_seconds": None, - "returncode": None, - "stdout": "", - "stderr": "File not found", - }) - continue - print(f"Running {fname}...") - res = run_file(fpath) - print(f" -> {fname}: {res['elapsed_seconds']:.4f}s, returncode={res['returncode']}") - results.append(res) - - out_path = os.path.join(base, "run_lhs_results.json") - with open(out_path, "w") as f: - json.dump(results, f, indent=2) - - # Print only the array of elapsed_seconds for quick consumption, then full JSON - elapsed_array = [r["elapsed_seconds"] for r in results] - print("\nElapsed seconds array:") - print(json.dumps(elapsed_array)) - print("\nFull results saved to:", out_path) - print(json.dumps(results, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/src/glayout/blocks/ATLAS/test_comprehensive_fix.py b/src/glayout/blocks/ATLAS/test_comprehensive_fix.py deleted file mode 100644 index 76da9854..00000000 --- a/src/glayout/blocks/ATLAS/test_comprehensive_fix.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python3 -""" -Comprehensive test script to verify that all netlist info dict fixes work correctly. -Tests multiple components to ensure the fix is applied consistently. -""" - -import sys -import os -import json -from pathlib import Path - -# Add the glayout path -glayout_path = "/home/arnavshukla/OpenFASOC/openfasoc/generators/glayout" -if glayout_path not in sys.path: - sys.path.insert(0, glayout_path) - -# Set up environment -os.environ['PDK_ROOT'] = '/opt/conda/envs/GLdev/share/pdk' -os.environ['PDK'] = 'sky130A' - -def test_component_info_serialization(component, component_name): - """Test that a component's info dict can be JSON serialized""" - print(f"\nTesting {component_name}...") - - try: - # Check netlist storage - netlist_value = component.info.get('netlist') - netlist_data = component.info.get('netlist_data') - - print(f" Netlist type: {type(netlist_value)}") - print(f" Netlist data type: {type(netlist_data)}") - - success = True - - # Verify netlist is stored as string - if not isinstance(netlist_value, str): - print(f" โŒ FAILED: netlist should be string, got {type(netlist_value)}") - success = False - else: - print(" โœ… SUCCESS: netlist is stored as string") - - # Verify netlist_data is available for gdsfactory 7.16.0+ compatibility - if netlist_data is None: - print(" โš ๏ธ WARNING: netlist_data is None - may not work with gdsfactory 7.16.0+") - elif isinstance(netlist_data, dict): - required_keys = ['circuit_name', 'nodes', 'source_netlist'] - if all(key in netlist_data for key in required_keys): - print(" โœ… SUCCESS: netlist_data contains all required fields for reconstruction") - else: - print(f" โŒ FAILED: netlist_data missing required keys: {[k for k in required_keys if k not in netlist_data]}") - success = False - else: - print(f" โŒ FAILED: netlist_data should be dict, got {type(netlist_data)}") - success = False - - # Test JSON serialization - try: - info_copy = {} - for key, value in component.info.items(): - if isinstance(value, (str, int, float, bool, list, tuple, dict)): - info_copy[key] = value - else: - info_copy[key] = str(value) - - json_str = json.dumps(info_copy, indent=2) - print(" โœ… SUCCESS: info dict can be JSON serialized") - - except Exception as e: - print(f" โŒ FAILED: JSON serialization failed: {e}") - success = False - - return success - - except Exception as e: - print(f" โŒ FAILED: Test failed with error: {e}") - return False - -def main(): - """Test multiple components to ensure consistent behavior""" - print("๐Ÿงช Comprehensive Netlist Serialization Test") - print("=" * 60) - - from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk - pdk = sky130_mapped_pdk - - test_results = [] - - # Test 1: Basic FETs - try: - print("\n๐Ÿ“‹ Testing Basic Components...") - from glayout.flow.primitives.fet import nmos, pmos - - nfet = nmos(pdk, width=1.0, length=0.15, fingers=1) - test_results.append(("NMOS", test_component_info_serialization(nfet, "NMOS"))) - - pfet = pmos(pdk, width=2.0, length=0.15, fingers=1) - test_results.append(("PMOS", test_component_info_serialization(pfet, "PMOS"))) - - except Exception as e: - print(f"โŒ Failed to test basic FETs: {e}") - test_results.append(("Basic FETs", False)) - - # Test 2: Transmission Gate - try: - print("\n๐Ÿ“‹ Testing Transmission Gate...") - from transmission_gate import transmission_gate - - tg = transmission_gate( - pdk=pdk, - width=(1.0, 2.0), - length=(0.15, 0.15), - fingers=(1, 1), - multipliers=(1, 1) - ) - test_results.append(("Transmission Gate", test_component_info_serialization(tg, "Transmission Gate"))) - - except Exception as e: - print(f"โŒ Failed to test transmission gate: {e}") - test_results.append(("Transmission Gate", False)) - - # Test 3: FVF (if available) - try: - print("\n๐Ÿ“‹ Testing Flipped Voltage Follower...") - from fvf import flipped_voltage_follower - - fvf = flipped_voltage_follower( - pdk=pdk, - width=(1.0, 0.5), - length=(0.15, 0.15), - fingers=(1, 1) - ) - test_results.append(("FVF", test_component_info_serialization(fvf, "Flipped Voltage Follower"))) - - except Exception as e: - print(f"โš ๏ธ FVF test skipped: {e}") - - # Test 4: MIM Capacitor (if available) - try: - print("\n๐Ÿ“‹ Testing MIM Capacitor...") - from glayout.flow.primitives.mimcap import mimcap - - cap = mimcap(pdk=pdk, size=(5.0, 5.0)) - test_results.append(("MIM Cap", test_component_info_serialization(cap, "MIM Capacitor"))) - - except Exception as e: - print(f"โš ๏ธ MIM Cap test skipped: {e}") - - # Summary - print("\n" + "=" * 60) - print("๐Ÿ“Š TEST SUMMARY") - print("=" * 60) - - passed = sum(1 for _, result in test_results if result) - total = len(test_results) - - for component_name, result in test_results: - status = "โœ… PASS" if result else "โŒ FAIL" - print(f"{status}: {component_name}") - - print(f"\nOverall: {passed}/{total} tests passed ({passed/total*100:.1f}%)") - - if passed == total: - print("\n๐ŸŽ‰ ALL TESTS PASSED!") - print("The gymnasium info dict error should be resolved for your friend.") - print("\nSolution Summary:") - print("- All netlist objects are now stored as strings in component.info['netlist']") - print("- Netlist data is preserved in component.info['netlist_data'] for reconstruction") - print("- This prevents gymnasium from encountering unsupported object types") - print("- Compatible with both gdsfactory 7.7.0 and 7.16.0+ strict Pydantic validation") - return True - else: - print(f"\nโš ๏ธ {total - passed} tests failed. Some issues may remain.") - return False - -if __name__ == "__main__": - success = main() - if success: - print("\nโœ… Fix validation completed successfully!") - else: - print("\nโŒ Some issues detected. Please review the failed tests.") diff --git a/src/glayout/blocks/ATLAS/test_lvs_fix.py b/src/glayout/blocks/ATLAS/test_lvs_fix.py deleted file mode 100644 index 1fce7709..00000000 --- a/src/glayout/blocks/ATLAS/test_lvs_fix.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/env python3 -""" -Test script to verify LVS functionality works with the netlist serialization fix. -Tests specifically for the 'str' object has no attribute 'generate_netlist' error. -""" - -import sys -import os -from pathlib import Path - -# Add the glayout path -glayout_path = "/home/arnavshukla/OpenFASOC/openfasoc/generators/glayout" -if glayout_path not in sys.path: - sys.path.insert(0, glayout_path) - -# Set up environment -os.environ['PDK_ROOT'] = '/opt/conda/envs/GLdev/share/pdk' -os.environ['PDK'] = 'sky130A' - -def test_lvs_netlist_generation(): - """Test that LVS can generate netlists from component info without errors""" - print("๐Ÿงช Testing LVS Netlist Generation Fix...") - - try: - from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk - from transmission_gate import transmission_gate, add_tg_labels - - pdk = sky130_mapped_pdk - - print("๐Ÿ“‹ Creating transmission gate component...") - tg = transmission_gate( - pdk=pdk, - width=(1.0, 2.0), - length=(0.15, 0.15), - fingers=(1, 1), - multipliers=(1, 1) - ) - - print("๐Ÿ“‹ Adding labels...") - tg_labeled = add_tg_labels(tg, pdk) - tg_labeled.name = "test_transmission_gate" - - print("๐Ÿ“‹ Testing netlist generation in LVS context...") - - # Test the netlist generation logic from mappedpdk.py - from glayout.flow.spice.netlist import Netlist - - # Simulate what happens in lvs_netgen when netlist is None - layout = tg_labeled - - # Try to get stored object first (for older gdsfactory versions) - if 'netlist_obj' in layout.info: - print("โœ… Found netlist_obj in component.info") - netlist_obj = layout.info['netlist_obj'] - # Try to reconstruct from netlist_data (for newer gdsfactory versions) - elif 'netlist_data' in layout.info: - print("โœ… Found netlist_data in component.info") - data = layout.info['netlist_data'] - netlist_obj = Netlist( - circuit_name=data['circuit_name'], - nodes=data['nodes'] - ) - netlist_obj.source_netlist = data['source_netlist'] - else: - # Fallback: if it's already a string, use it directly - print("โ„น๏ธ Using string fallback for netlist") - netlist_string = layout.info.get('netlist', '') - if not isinstance(netlist_string, str): - print("โŒ FAILED: Expected string fallback but got:", type(netlist_string)) - return False - netlist_obj = None - - # Generate netlist if we have a netlist object - if netlist_obj is not None: - print("๐Ÿ“‹ Testing generate_netlist() call...") - try: - netlist_content = netlist_obj.generate_netlist() - print("โœ… SUCCESS: generate_netlist() worked without error") - print(f"๐Ÿ“„ Generated netlist length: {len(netlist_content)} characters") - - # Verify it contains expected content - if 'Transmission_Gate' in netlist_content: - print("โœ… SUCCESS: Netlist contains expected circuit name") - else: - print("โš ๏ธ WARNING: Netlist doesn't contain expected circuit name") - - return True - - except AttributeError as e: - if "'str' object has no attribute 'generate_netlist'" in str(e): - print("โŒ FAILED: Still getting the 'str' object error:", e) - return False - else: - print("โŒ FAILED: Unexpected AttributeError:", e) - return False - except Exception as e: - print("โŒ FAILED: Unexpected error during generate_netlist():", e) - return False - else: - print("โ„น๏ธ No netlist object to test - using string representation") - netlist_string = layout.info.get('netlist', '') - if isinstance(netlist_string, str) and len(netlist_string) > 0: - print("โœ… SUCCESS: String netlist available as fallback") - return True - else: - print("โŒ FAILED: No valid netlist representation found") - return False - - except Exception as e: - print(f"โŒ FAILED: Test failed with error: {e}") - import traceback - traceback.print_exc() - return False - -def test_actual_lvs_call(): - """Test a simplified LVS call to see if it works""" - print("\n๐Ÿงช Testing Actual LVS Functionality...") - - try: - from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk - from transmission_gate import transmission_gate, add_tg_labels - - pdk = sky130_mapped_pdk - - print("๐Ÿ“‹ Creating and labeling transmission gate...") - tg = transmission_gate(pdk=pdk, width=(1.0, 2.0), length=(0.15, 0.15)) - tg_labeled = add_tg_labels(tg, pdk) - tg_labeled.name = "lvs_test_tg" - - print("๐Ÿ“‹ Writing GDS file...") - gds_file = "lvs_test_tg.gds" - tg_labeled.write_gds(gds_file) - - print("๐Ÿ“‹ Attempting LVS call...") - try: - # This should not fail with the "'str' object has no attribute 'generate_netlist'" error - result = pdk.lvs_netgen(tg_labeled, "lvs_test_tg") - print("โœ… SUCCESS: LVS call completed without netlist generation error") - print("๐Ÿ“Š LVS result keys:", list(result.keys()) if isinstance(result, dict) else "Not a dict") - return True - - except AttributeError as e: - if "'str' object has no attribute 'generate_netlist'" in str(e): - print("โŒ FAILED: LVS still has the 'str' object error:", e) - return False - else: - print("โš ๏ธ LVS failed with different AttributeError (may be expected):", e) - return True # The specific error we're fixing is resolved - - except Exception as e: - print("โš ๏ธ LVS failed with other error (may be expected in test environment):", e) - print("โ„น๏ธ This is likely due to missing PDK files or tools, not our fix") - return True # The specific error we're fixing is resolved - - except Exception as e: - print(f"โŒ FAILED: Test failed with error: {e}") - import traceback - traceback.print_exc() - return False - -def main(): - """Main test function""" - print("๐Ÿ”ง Testing LVS Netlist Generation Fix") - print("=" * 50) - - test1_passed = test_lvs_netlist_generation() - test2_passed = test_actual_lvs_call() - - print("\n" + "=" * 50) - print("๐Ÿ“Š TEST SUMMARY") - print("=" * 50) - - if test1_passed: - print("โœ… PASS: Netlist generation logic") - else: - print("โŒ FAIL: Netlist generation logic") - - if test2_passed: - print("โœ… PASS: LVS call functionality") - else: - print("โŒ FAIL: LVS call functionality") - - overall_success = test1_passed and test2_passed - - if overall_success: - print("\n๐ŸŽ‰ ALL TESTS PASSED!") - print("The 'str' object has no attribute 'generate_netlist' error should be resolved.") - return True - else: - print("\nโš ๏ธ Some tests failed. The LVS fix may need further adjustment.") - return False - -if __name__ == "__main__": - success = main() - if success: - print("\nโœ… LVS fix validation completed successfully!") - else: - print("\nโŒ LVS fix validation failed.") diff --git a/src/glayout/blocks/ATLAS/test_netlist_fix.py b/src/glayout/blocks/ATLAS/test_netlist_fix.py deleted file mode 100644 index d49cfbbb..00000000 --- a/src/glayout/blocks/ATLAS/test_netlist_fix.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python3 -""" -Test script to verify that the netlist info dict fix works correctly. -""" - -import sys -import os -from pathlib import Path - -# Add the glayout path -glayout_path = "/home/arnavshukla/OpenFASOC/openfasoc/generators/glayout" -if glayout_path not in sys.path: - sys.path.insert(0, glayout_path) - -# Set up environment -os.environ['PDK_ROOT'] = '/opt/conda/envs/GLdev/share/pdk' -os.environ['PDK'] = 'sky130A' - -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk -from transmission_gate import transmission_gate, add_tg_labels - -def test_netlist_serialization(): - """Test that netlist objects are properly serialized in component.info""" - print("Testing transmission gate netlist serialization...") - - try: - # Create a transmission gate with default parameters - tg = transmission_gate( - pdk=sky130_mapped_pdk, - width=(1.0, 2.0), - length=(0.15, 0.15), - fingers=(1, 1), - multipliers=(1, 1) - ) - - # Check that netlist is stored as string (not object) - netlist_value = tg.info.get('netlist') - netlist_obj = tg.info.get('netlist_obj') - - print(f"Netlist type: {type(netlist_value)}") - print(f"Netlist object type: {type(netlist_obj)}") - - # Verify types - if isinstance(netlist_value, str): - print("โœ… SUCCESS: netlist is stored as string") - else: - print(f"โŒ FAILED: netlist is stored as {type(netlist_value)}") - return False - - if netlist_obj is not None and hasattr(netlist_obj, 'circuit_name'): - print("โœ… SUCCESS: netlist_obj is available for internal use") - else: - print("โŒ FAILED: netlist_obj is not properly stored") - return False - - # Test that we can create JSON-serializable info dict - import json - try: - # Create a copy of info dict with only basic types - info_copy = {} - for key, value in tg.info.items(): - if isinstance(value, (str, int, float, bool, list, tuple)): - info_copy[key] = value - else: - info_copy[key] = str(value) - - json_str = json.dumps(info_copy, indent=2) - print("โœ… SUCCESS: info dict can be JSON serialized") - print(f"JSON preview: {json_str[:200]}...") - - except Exception as e: - print(f"โŒ FAILED: JSON serialization failed: {e}") - return False - - return True - - except Exception as e: - print(f"โŒ FAILED: Test failed with error: {e}") - return False - -if __name__ == "__main__": - print("Testing netlist serialization fix...") - success = test_netlist_serialization() - if success: - print("\n๐ŸŽ‰ All tests passed! The fix should resolve the gymnasium info dict error.") - else: - print("\nโš ๏ธ Tests failed. The issue may not be fully resolved.") diff --git a/src/glayout/blocks/ATLAS/transmission_gate.py b/src/glayout/blocks/ATLAS/transmission_gate.py index 3e42e7dc..5285c484 100644 --- a/src/glayout/blocks/ATLAS/transmission_gate.py +++ b/src/glayout/blocks/ATLAS/transmission_gate.py @@ -1,19 +1,19 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.cell import cell from gdsfactory.component import Component from gdsfactory import Component -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, movex, movey -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.primitives.guardring import tapring -from glayout.flow.pdk.util.port_utils import add_ports_perimeter -from glayout.flow.spice.netlist import Netlist -from glayout.flow.primitives.via_gen import via_stack +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, movex, movey +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.primitives.guardring import tapring +from glayout.util.port_utils import add_ports_perimeter +from glayout.spice.netlist import Netlist +from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle try: from evaluator_wrapper import run_evaluation # pyright: ignore[reportMissingImports] @@ -86,30 +86,21 @@ def get_component_netlist(component) -> Netlist: # Fallback: return empty netlist return Netlist() -def tg_netlist(nfet_comp, pfet_comp) -> str: - """Generate SPICE netlist string for transmission gate - gymnasium compatible""" +def tg_netlist(nfet: Component, pfet: Component) -> Netlist: + """Generate SPICE netlist for transmission gate using proper Netlist class""" - # Get the SPICE netlists directly from components - nmos_spice = nfet_comp.info.get('netlist', '') - pmos_spice = pfet_comp.info.get('netlist', '') + netlist = Netlist(circuit_name='Transmission_Gate', nodes=['VIN', 'VSS', 'VOUT', 'VCC', 'VGP', 'VGN']) - if not nmos_spice or not pmos_spice: - raise ValueError("Component netlists not found") + # Get netlist objects from FET components + nfet_netlist = get_component_netlist(nfet) + pfet_netlist = get_component_netlist(pfet) - # Create the transmission gate SPICE netlist by combining the primitives - tg_spice = f"""{nmos_spice} + # Connect NMOS: D->VOUT, G->VGN, S->VIN, B->VSS + netlist.connect_netlist(nfet_netlist, [('D', 'VOUT'), ('G', 'VGN'), ('S', 'VIN'), ('B', 'VSS')]) + # Connect PMOS: D->VOUT, G->VGP, S->VIN, B->VCC + netlist.connect_netlist(pfet_netlist, [('D', 'VOUT'), ('G', 'VGP'), ('S', 'VIN'), ('B', 'VCC')]) -{pmos_spice} - -.subckt transmission_gate D G S VDD VSS -* PMOS: connects D to S when G is low (G_n is high) -X0 D G_n S VDD PMOS -* NMOS: connects D to S when G is high -X1 D G S VSS NMOS -.ends transmission_gate -""" - - return tg_spice + return netlist @cell def transmission_gate( @@ -163,12 +154,12 @@ def transmission_gate( top_level.add_ports(guardring_ref.get_ports_list(),prefix="tap_") component = component_snap_to_grid(rename_ports_by_orientation(top_level)) - # Generate netlist as SPICE string for gymnasium compatibility - netlist_string = tg_netlist(nfet, pfet) - # Store as string for gymnasium compatibility - LVS method supports this directly - component.info['netlist'] = netlist_string - + # Generate netlist using proper Netlist class + netlist_obj = tg_netlist(nfet, pfet) + + # Store netlist - LVS method handles both string and Netlist objects + component.info['netlist'] = netlist_obj return component From a0236d0cd2a2df1c80f298a260f70b79826b84b5 Mon Sep 17 00:00:00 2001 From: Aditya Kak Date: Sun, 25 Jan 2026 20:06:14 +0000 Subject: [PATCH 2/5] added error handling for string netlists in mappedpdk.py --- src/glayout/pdk/mappedpdk.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/glayout/pdk/mappedpdk.py b/src/glayout/pdk/mappedpdk.py index d6193ff3..35a03564 100644 --- a/src/glayout/pdk/mappedpdk.py +++ b/src/glayout/pdk/mappedpdk.py @@ -259,8 +259,6 @@ class MappedPDK(Pdk): "via4", "met5", "capmet", - "lvs_bjt", - "drc_bjt", # _pin layers "met5_pin", "met4_pin", @@ -294,8 +292,6 @@ class MappedPDK(Pdk): grules: dict[StrictStr, dict[StrictStr, Optional[dict[StrictStr, Any]]]] pdk_files: dict[StrictStr, Union[PathType, None]] - valid_bjt_sizes: dict[StrictStr, list[tuple[float,float]]] - @validator("models") def models_check(cls, models_obj: dict[StrictStr, StrictStr]): for model in models_obj.keys(): @@ -764,7 +760,14 @@ def write_spice(input_cdl, output_spice, lvs_schematic_ref_file): layout.write_gds(str(gds_path)) if netlist is None: - netlist = layout.info['netlist'].generate_netlist() + # Handle both string netlists and Netlist objects + netlist_info = layout.info['netlist'] + if isinstance(netlist_info, str): + # Already a string, use directly + netlist = netlist_info + else: + # Netlist object, call generate_netlist() + netlist = netlist_info.generate_netlist() with open(str(netlist_from_comp), 'w') as f: f.write(netlist) else: From b7c7392ed026bd204540594dbff19a7ef14fc3ae Mon Sep 17 00:00:00 2001 From: Aditya Kak Date: Mon, 2 Feb 2026 09:25:27 +0000 Subject: [PATCH 3/5] fixed naming of netlist obj, also removed extras from ATLAS folder; all elementary pcells are now fully working and in their respective folders --- src/glayout/blocks/ATLAS/current_mirror.py | 223 --------------- src/glayout/blocks/ATLAS/diff_pair.py | 257 ------------------ src/glayout/blocks/ATLAS/fvf.py | 207 -------------- src/glayout/blocks/ATLAS/lvcm.py | 201 -------------- src/glayout/blocks/ATLAS/transmission_gate.py | 173 ------------ 5 files changed, 1061 deletions(-) delete mode 100644 src/glayout/blocks/ATLAS/current_mirror.py delete mode 100644 src/glayout/blocks/ATLAS/diff_pair.py delete mode 100644 src/glayout/blocks/ATLAS/fvf.py delete mode 100644 src/glayout/blocks/ATLAS/lvcm.py delete mode 100644 src/glayout/blocks/ATLAS/transmission_gate.py diff --git a/src/glayout/blocks/ATLAS/current_mirror.py b/src/glayout/blocks/ATLAS/current_mirror.py deleted file mode 100644 index 6097dcb7..00000000 --- a/src/glayout/blocks/ATLAS/current_mirror.py +++ /dev/null @@ -1,223 +0,0 @@ -from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized, two_pfet_interdigitized -from glayout.pdk.mappedpdk import MappedPDK -from glayout.routing.c_route import c_route -from glayout.routing.L_route import L_route -from glayout.routing.straight_route import straight_route -from glayout.spice.netlist import Netlist -from glayout.pdk.sky130_mapped import sky130_mapped_pdk as sky130 -from glayout.primitives.fet import nmos, pmos -from glayout.primitives.guardring import tapring -from glayout.util.port_utils import add_ports_perimeter, rename_ports_by_orientation -from gdsfactory.component import Component -from gdsfactory.cell import cell -from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port -from typing import Optional, Union -from glayout.pdk.sky130_mapped import sky130_mapped_pdk -from glayout.primitives.via_gen import via_stack -from gdsfactory.components import text_freetype, rectangle - -try: - from evaluator_wrapper import run_evaluation -except ImportError: - print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") - run_evaluation = None - -def add_cm_labels(cm_in: Component, - pdk: MappedPDK - ) -> Component: - - cm_in.unlock() - met2_pin = (68,16) - met2_label = (68,5) - - # list that will contain all port/comp info - move_info = list() - # create labels and append to info list - # vss - vsslabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vsslabel.add_label(text="VSS",layer=pdk.get_glayer("met2_label")) - move_info.append((vsslabel,cm_in.ports["fet_A_source_E"],None)) - - # vref - vreflabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vreflabel.add_label(text="VREF",layer=pdk.get_glayer("met2_label")) - move_info.append((vreflabel,cm_in.ports["fet_A_drain_N"],None)) - - # vcopy - vcopylabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vcopylabel.add_label(text="VCOPY",layer=pdk.get_glayer("met2_label")) - move_info.append((vcopylabel,cm_in.ports["fet_B_drain_N"],None)) - - # VB - vblabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.5,0.5),centered=True).copy() - vblabel.add_label(text="VB",layer=pdk.get_glayer("met2_label")) - move_info.append((vblabel,cm_in.ports["welltie_S_top_met_S"], None)) - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - compref = align_comp_to_port(comp, prt, alignment=alignment) - cm_in.add(compref) - return cm_in.flatten() - -def current_mirror_netlist( - pdk: MappedPDK, - width: float, - length: float, - multipliers: int, - with_dummy: bool = True, - n_or_p_fet: Optional[str] = 'nfet', - subckt_only: Optional[bool] = False -) -> Netlist: - if length is None: - length = pdk.get_grule('poly')['min_width'] - if width is None: - width = 3 - mtop = multipliers if subckt_only else 1 - model = pdk.models[n_or_p_fet] - - source_netlist = """.subckt {circuit_name} {nodes} """ + f'l={length} w={width} m={mtop} ' + """ -XA VREF VREF VSS VB {model} l={{l}} w={{w}} m={{m}} -XB VCOPY VREF VSS VB {model} l={{l}} w={{w}} m={{m}}""" - if with_dummy: - source_netlist += "\nXDUMMY VB VB VB VB {model} l={{l}} w={{w}} m={{2}}" - source_netlist += "\n.ends {circuit_name}" - - instance_format = "X{name} {nodes} {circuit_name} l={length} w={width} m={mult}" - - return Netlist( - circuit_name='CMIRROR', - nodes=['VREF', 'VCOPY', 'VSS', 'VB'], - source_netlist=source_netlist, - instance_format=instance_format, - parameters={ - 'model': model, - 'width': width, - 'length': length, - 'mult': multipliers - } - ) - - -#@cell -def current_mirror( - pdk: MappedPDK, - numcols: int = 3, - device: str = 'nfet', - with_dummy: Optional[bool] = True, - with_substrate_tap: Optional[bool] = False, - with_tie: Optional[bool] = True, - tie_layers: tuple[str,str]=("met2","met1"), - **kwargs -) -> Component: - """An instantiable current mirror that returns a Component object. The current mirror is a two transistor interdigitized structure with a shorted source and gate. It can be instantiated with either nmos or pmos devices. It can also be instantiated with a dummy device, a substrate tap, and a tie layer, and is centered at the origin. Transistor A acts as the reference and Transistor B acts as the mirror fet - - Args: - pdk (MappedPDK): the process design kit to use - numcols (int): number of columns of the interdigitized fets - device (str): nfet or pfet (can only interdigitize one at a time with this option) - with_dummy (bool): True places dummies on either side of the interdigitized fets - with_substrate_tap (bool): boolean to decide whether to place a substrate tapring - with_tie (bool): boolean to decide whether to place a tapring for tielayer - tie_layers (tuple[str,str], optional): the layers to use for the tie. Defaults to ("met2","met1"). - **kwargs: The keyword arguments are passed to the two_nfet_interdigitized or two_pfet_interdigitized functions and need to be valid arguments that can be accepted by the multiplier function - - Returns: - Component: a current mirror component object - """ - top_level = Component("current mirror") - if device in ['nmos', 'nfet']: - interdigitized_fets = two_nfet_interdigitized( - pdk, - numcols=numcols, - dummy=with_dummy, - with_substrate_tap=False, - with_tie=False, - **kwargs - ) - elif device in ['pmos', 'pfet']: - interdigitized_fets = two_pfet_interdigitized( - pdk, - numcols=numcols, - dummy=with_dummy, - with_substrate_tap=False, - with_tie=False, - **kwargs - ) - top_level.add_ports(interdigitized_fets.get_ports_list(), prefix="fet_") - maxmet_sep = pdk.util_max_metal_seperation() - # short source of the fets - source_short = interdigitized_fets << c_route(pdk, interdigitized_fets.ports['A_source_E'], interdigitized_fets.ports['B_source_E'], extension=3*maxmet_sep, viaoffset=False) - # short gates of the fets - gate_short = interdigitized_fets << c_route(pdk, interdigitized_fets.ports['A_gate_W'], interdigitized_fets.ports['B_gate_W'], extension=3*maxmet_sep, viaoffset=False) - # short gate and drain of one of the reference - interdigitized_fets << L_route(pdk, interdigitized_fets.ports['A_drain_W'], gate_short.ports['con_N'], viaoffset=False, fullbottom=False) - - top_level << interdigitized_fets - if with_tie: - if device in ['nmos','nfet']: - tap_layer = "p+s/d" - if device in ['pmos','pfet']: - tap_layer = "n+s/d" - tap_sep = max( - float(pdk.util_max_metal_seperation()), - float(pdk.get_grule("active_diff", "active_tap")["min_separation"]), - ) - tap_sep += float(pdk.get_grule(tap_layer, "active_tap")["min_enclosure"]) - tap_encloses = ( - 2 * (tap_sep + interdigitized_fets.xmax), - 2 * (tap_sep + interdigitized_fets.ymax), - ) - tie_ref = top_level << tapring(pdk, enclosed_rectangle = tap_encloses, sdlayer = tap_layer, horizontal_glayer = tie_layers[0], vertical_glayer = tie_layers[1]) - top_level.add_ports(tie_ref.get_ports_list(), prefix="welltie_") - try: - top_level << straight_route(pdk, top_level.ports[f"fet_B_{numcols - 1}_dummy_R_gsdcon_top_met_E"],top_level.ports["welltie_E_top_met_E"],glayer2="met1") - top_level << straight_route(pdk, top_level.ports["fet_A_0_dummy_L_gsdcon_top_met_W"],top_level.ports["welltie_W_top_met_W"],glayer2="met1") - except KeyError: - pass - try: - end_col = numcols - 1 - port1 = f'B_{end_col}_dummy_R_gdscon_top_met_E' - top_level << straight_route(pdk, top_level.ports[port1], top_level.ports["welltie_E_top_met_E"], glayer2="met1") - except KeyError: - pass - - # add a pwell - if device in ['nmos','nfet']: - top_level.add_padding(layers = (pdk.get_glayer("pwell"),), default = pdk.get_grule("pwell", "active_tap")["min_enclosure"], ) - top_level = add_ports_perimeter(top_level, layer = pdk.get_glayer("pwell"), prefix="well_") - if device in ['pmos','pfet']: - top_level.add_padding(layers = (pdk.get_glayer("nwell"),), default = pdk.get_grule("nwell", "active_tap")["min_enclosure"], ) - top_level = add_ports_perimeter(top_level, layer = pdk.get_glayer("nwell"), prefix="well_") - - - # add the substrate tap if specified - if with_substrate_tap: - subtap_sep = pdk.get_grule("dnwell", "active_tap")["min_separation"] - subtap_enclosure = ( - 2.5 * (subtap_sep + interdigitized_fets.xmax), - 2.5 * (subtap_sep + interdigitized_fets.ymax), - ) - subtap_ring = top_level << tapring(pdk, enclosed_rectangle = subtap_enclosure, sdlayer = "p+s/d", horizontal_glayer = "met2", vertical_glayer = "met1") - top_level.add_ports(subtap_ring.get_ports_list(), prefix="substrate_tap_") - - top_level.add_ports(source_short.get_ports_list(), prefix='purposegndports') - - - top_level.info['netlist'] = current_mirror_netlist( - pdk, - width=kwargs.get('width', 3), length=kwargs.get('length', 0.15), multipliers=numcols, with_dummy=with_dummy, - n_or_p_fet=device, - subckt_only=True - ) - - return top_level - -if __name__=="__main__": - current_mirror = add_cm_labels(current_mirror(sky130_mapped_pdk, device='pfet'),sky130_mapped_pdk) - current_mirror.show() - current_mirror.name = "CMIRROR" - #magic_drc_result = sky130_mapped_pdk.drc_magic(current_mirror, current_mirror.name) - #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(current_mirror, current_mirror.name) - current_mirror_gds = current_mirror.write_gds("current_mirror.gds") - res = run_evaluation("current_mirror.gds", current_mirror.name, current_mirror) \ No newline at end of file diff --git a/src/glayout/blocks/ATLAS/diff_pair.py b/src/glayout/blocks/ATLAS/diff_pair.py deleted file mode 100644 index 8c3221a7..00000000 --- a/src/glayout/blocks/ATLAS/diff_pair.py +++ /dev/null @@ -1,257 +0,0 @@ -from typing import Optional, Union - -from gdsfactory.cell import cell -from gdsfactory.component import Component, copy -from gdsfactory.components.rectangle import rectangle -from gdsfactory.routing.route_quad import route_quad -from gdsfactory.routing.route_sharp import route_sharp -from glayout.pdk.mappedpdk import MappedPDK -from glayout.util.comp_utils import align_comp_to_port, evaluate_bbox, movex, movey -from glayout.util.port_utils import ( - add_ports_perimeter, - get_orientation, - print_ports, - rename_ports_by_list, - rename_ports_by_orientation, - set_port_orientation, -) -from glayout.util.snap_to_grid import component_snap_to_grid -from glayout.placement.common_centroid_ab_ba import common_centroid_ab_ba -from glayout.primitives.fet import nmos, pmos -from glayout.primitives.guardring import tapring -from glayout.primitives.via_gen import via_stack -from glayout.routing.c_route import c_route -from glayout.routing.smart_route import smart_route -from glayout.routing.straight_route import straight_route -from glayout.spice import Netlist -from glayout.pdk.sky130_mapped import sky130_mapped_pdk -from gdsfactory.components import text_freetype -try: - from evaluator_wrapper import run_evaluation -except ImportError: - print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") - run_evaluation = None - - -def add_df_labels(df_in: Component, - pdk: MappedPDK - ) -> Component: - - df_in.unlock() - met1_pin = (67,16) - met1_label = (67,5) - met2_pin = (68,16) - met2_label = (68,5) - # list that will contain all port/comp info - move_info = list() - # create labels and append to info list - # vtail - vtaillabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vtaillabel.add_label(text="VTAIL",layer=pdk.get_glayer("met2_label")) - move_info.append((vtaillabel,df_in.ports["bl_multiplier_0_source_S"],None)) - - # vdd1 - vdd1label = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vdd1label.add_label(text="VDD1",layer=pdk.get_glayer("met2_label")) - move_info.append((vdd1label,df_in.ports["tl_multiplier_0_drain_N"],None)) - - # vdd2 - vdd2label = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vdd2label.add_label(text="VDD2",layer=pdk.get_glayer("met2_label")) - move_info.append((vdd2label,df_in.ports["tr_multiplier_0_drain_N"],None)) - - # VB - vblabel = rectangle(layer=pdk.get_glayer("met1_pin"),size=(0.5,0.5),centered=True).copy() - vblabel.add_label(text="B",layer=pdk.get_glayer("met1_label")) - move_info.append((vblabel,df_in.ports["tap_N_top_met_S"], None)) - - # VP - vplabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vplabel.add_label(text="VP",layer=pdk.get_glayer("met2_label")) - move_info.append((vplabel,df_in.ports["br_multiplier_0_gate_S"], None)) - - # VN - vnlabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vnlabel.add_label(text="VN",layer=pdk.get_glayer("met2_label")) - move_info.append((vnlabel,df_in.ports["bl_multiplier_0_gate_S"], None)) - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - compref = align_comp_to_port(comp, prt, alignment=alignment) - df_in.add(compref) - return df_in.flatten() - -def diff_pair_netlist(fetL: Component, fetR: Component) -> Netlist: - diff_pair_netlist = Netlist(circuit_name='DIFF_PAIR', nodes=['VP', 'VN', 'VDD1', 'VDD2', 'VTAIL', 'B']) - diff_pair_netlist.connect_netlist( - fetL.info['netlist'], - [('D', 'VDD1'), ('G', 'VP'), ('S', 'VTAIL'), ('B', 'B')] - ) - diff_pair_netlist.connect_netlist( - fetR.info['netlist'], - [('D', 'VDD2'), ('G', 'VN'), ('S', 'VTAIL'), ('B', 'B')] - ) - return diff_pair_netlist - -@cell -def diff_pair( - pdk: MappedPDK, - width: float = 3, - fingers: int = 4, - length: Optional[float] = None, - n_or_p_fet: bool = True, - plus_minus_seperation: float = 0, - rmult: int = 1, - dummy: Union[bool, tuple[bool, bool]] = True, - substrate_tap: bool=True -) -> Component: - """create a diffpair with 2 transistors placed in two rows with common centroid place. Sources are shorted - width = width of the transistors - fingers = number of fingers in the transistors (must be 2 or more) - length = length of the transistors, None or 0 means use min length - short_source = if true connects source of both transistors - n_or_p_fet = if true the diffpair is made of nfets else it is made of pfets - substrate_tap: if true place a tapring around the diffpair (connects on met1) - """ - # TODO: error checking - pdk.activate() - diffpair = Component() - # create transistors - well = None - if isinstance(dummy, bool): - dummy = (dummy, dummy) - if n_or_p_fet: - fetL = nmos(pdk, width=width, fingers=fingers,length=length,multipliers=1,with_tie=False,with_dummy=(dummy[0], False),with_dnwell=False,with_substrate_tap=False,rmult=rmult) - fetR = nmos(pdk, width=width, fingers=fingers,length=length,multipliers=1,with_tie=False,with_dummy=(False,dummy[1]),with_dnwell=False,with_substrate_tap=False,rmult=rmult) - min_spacing_x = pdk.get_grule("n+s/d")["min_separation"] - 2*(fetL.xmax - fetL.ports["multiplier_0_plusdoped_E"].center[0]) - well = "pwell" - else: - fetL = pmos(pdk, width=width, fingers=fingers,length=length,multipliers=1,with_tie=False,with_dummy=(dummy[0], False),dnwell=False,with_substrate_tap=False,rmult=rmult) - fetR = pmos(pdk, width=width, fingers=fingers,length=length,multipliers=1,with_tie=False,with_dummy=(False,dummy[1]),dnwell=False,with_substrate_tap=False,rmult=rmult) - min_spacing_x = pdk.get_grule("p+s/d")["min_separation"] - 2*(fetL.xmax - fetL.ports["multiplier_0_plusdoped_E"].center[0]) - well = "nwell" - # place transistors - viam2m3 = via_stack(pdk,"met2","met3",centered=True) - metal_min_dim = max(pdk.get_grule("met2")["min_width"],pdk.get_grule("met3")["min_width"]) - metal_space = max(pdk.get_grule("met2")["min_separation"],pdk.get_grule("met3")["min_separation"],metal_min_dim) - gate_route_os = evaluate_bbox(viam2m3)[0] - fetL.ports["multiplier_0_gate_W"].width + metal_space - min_spacing_y = metal_space + 2*gate_route_os - min_spacing_y = min_spacing_y - 2*abs(fetL.ports["well_S"].center[1] - fetL.ports["multiplier_0_gate_S"].center[1]) - # TODO: fix spacing where you see +-0.5 - a_topl = (diffpair << fetL).movey(fetL.ymax+min_spacing_y/2+0.5).movex(0-fetL.xmax-min_spacing_x/2) - b_topr = (diffpair << fetR).movey(fetR.ymax+min_spacing_y/2+0.5).movex(fetL.xmax+min_spacing_x/2) - a_botr = (diffpair << fetR) - a_botr = a_botr.mirror_y() - a_botr.movey(0-0.5-fetL.ymax-min_spacing_y/2).movex(fetL.xmax+min_spacing_x/2) - b_botl = (diffpair << fetL) - b_botl = b_botl.mirror_y() - b_botl.movey(0-0.5-fetR.ymax-min_spacing_y/2).movex(0-fetL.xmax-min_spacing_x/2) - # if substrate tap place substrate tap - if substrate_tap: - tapref = diffpair << tapring(pdk,evaluate_bbox(diffpair,padding=1),horizontal_glayer="met1") - diffpair.add_ports(tapref.get_ports_list(),prefix="tap_") - try: - diffpair< Component: - diffpair = common_centroid_ab_ba(pdk,width,fingers,length,n_or_p_fet,rmult,dummy,substrate_tap) - diffpair << smart_route(pdk,diffpair.ports["A_source_E"],diffpair.ports["B_source_E"],diffpair, diffpair) - return diffpair - -if __name__=="__main__": - diff_pair = add_df_labels(diff_pair(sky130_mapped_pdk),sky130_mapped_pdk) - #diff_pair = diff_pair(sky130_mapped_pdk) - diff_pair.show() - diff_pair.name = "DIFF_PAIR" - #magic_drc_result = sky130_mapped_pdk.drc_magic(diff_pair, diff_pair.name) - #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(diff_pair, diff_pair.name) - diff_pair_gds = diff_pair.write_gds("diff_pair.gds") - res = run_evaluation("diff_pair.gds", diff_pair.name, diff_pair) \ No newline at end of file diff --git a/src/glayout/blocks/ATLAS/fvf.py b/src/glayout/blocks/ATLAS/fvf.py deleted file mode 100644 index 8ef53c46..00000000 --- a/src/glayout/blocks/ATLAS/fvf.py +++ /dev/null @@ -1,207 +0,0 @@ -from glayout.pdk.mappedpdk import MappedPDK -from glayout.pdk.sky130_mapped import sky130_mapped_pdk -from gdsfactory.cell import cell -from gdsfactory.component import Component -from gdsfactory import Component -from glayout.primitives.fet import nmos, pmos, multiplier -from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port -from glayout.util.snap_to_grid import component_snap_to_grid -from glayout.util.port_utils import rename_ports_by_orientation -from glayout.routing.straight_route import straight_route -from glayout.routing.c_route import c_route -from glayout.routing.L_route import L_route -from glayout.primitives.guardring import tapring -from glayout.util.port_utils import add_ports_perimeter -from glayout.spice.netlist import Netlist -from glayout.primitives.via_gen import via_stack -from gdsfactory.components import text_freetype, rectangle -from evaluator_wrapper import run_evaluation # CUSTOM IMPLEMENTED EVAL BOX - -def get_component_netlist(component): - """Helper function to get netlist object from component info, compatible with all gdsfactory versions""" - from glayout.spice.netlist import Netlist - - # Try to get stored object first (for older gdsfactory versions) - if 'netlist_obj' in component.info: - return component.info['netlist_obj'] - - # Try to reconstruct from netlist_data (for newer gdsfactory versions) - if 'netlist_data' in component.info: - data = component.info['netlist_data'] - netlist = Netlist( - circuit_name=data['circuit_name'], - nodes=data['nodes'] - ) - netlist.source_netlist = data['source_netlist'] - return netlist - - # Fallback: return the string representation (should not happen in normal operation) - return component.info.get('netlist', '') - -def fvf_netlist(fet_1: Component, fet_2: Component) -> Netlist: - - netlist = Netlist(circuit_name='FLIPPED_VOLTAGE_FOLLOWER', nodes=['VIN', 'VBULK', 'VOUT', 'Ib']) - - # Use helper function to get netlist objects regardless of gdsfactory version - fet_1_netlist = get_component_netlist(fet_1) - fet_2_netlist = get_component_netlist(fet_2) - netlist.connect_netlist(fet_1_netlist, [('D', 'Ib'), ('G', 'VIN'), ('S', 'VOUT'), ('B', 'VBULK')]) - netlist.connect_netlist(fet_2_netlist, [('D', 'VOUT'), ('G', 'Ib'), ('S', 'VBULK'), ('B', 'VBULK')]) - - return netlist - -def sky130_add_fvf_labels(fvf_in: Component) -> Component: - - fvf_in.unlock() - # define layers` - met1_pin = (68,16) - met1_label = (68,5) - met2_pin = (69,16) - met2_label = (69,5) - # list that will contain all port/comp info - move_info = list() - # create labels and append to info list - # gnd - gnd2label = rectangle(layer=met1_pin,size=(0.5,0.5),centered=True).copy() - gnd2label.add_label(text="VBULK",layer=met1_label) - move_info.append((gnd2label,fvf_in.ports["B_tie_N_top_met_N"],None)) - - #currentbias - ibiaslabel = rectangle(layer=met2_pin,size=(0.5,0.5),centered=True).copy() - ibiaslabel.add_label(text="Ib",layer=met2_label) - move_info.append((ibiaslabel,fvf_in.ports["A_drain_bottom_met_N"],None)) - - # output (3rd stage) - outputlabel = rectangle(layer=met2_pin,size=(0.5,0.5),centered=True).copy() - outputlabel.add_label(text="VOUT",layer=met2_label) - move_info.append((outputlabel,fvf_in.ports["A_source_bottom_met_N"],None)) - - # input - inputlabel = rectangle(layer=met1_pin,size=(0.5,0.5),centered=True).copy() - inputlabel.add_label(text="VIN",layer=met1_label) - move_info.append((inputlabel,fvf_in.ports["A_multiplier_0_gate_N"], None)) - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - compref = align_comp_to_port(comp, prt, alignment=alignment) - fvf_in.add(compref) - return fvf_in.flatten() - -@cell -def flipped_voltage_follower( - pdk: MappedPDK, - device_type: str = "nmos", - placement: str = "horizontal", - width: tuple[float,float] = (6.605703928526579, 3.713220935212418), - length: tuple[float,float] = (2.3659471990041707, 1.9639325665440608), - fingers: tuple[int,int] = (1, 1), - multipliers: tuple[int,int] = (2, 2), - dummy_1: tuple[bool,bool] = (True,True), - dummy_2: tuple[bool,bool] = (True,True), - tie_layers1: tuple[str,str] = ("met2","met1"), - tie_layers2: tuple[str,str] = ("met2","met1"), - sd_rmult: int=1, - **kwargs - ) -> Component: - """ - creates a Flipped Voltage Follower - pdk: pdk to use - device_type: either "nmos" or "pmos" - placement: either "horizontal" or "vertical" - width: (input fet, feedback fet) - length: (input fet, feedback fet) - fingers: (input fet, feedback fet) - multipliers: (input fet, feedback fet) - dummy_1: dummy for input fet - dummy_2: dummy for feedback fet - tie_layers1: tie layers for input fet - tie_layers2: tie layers for feedback fet - sd_rmult: sd_rmult for both fets - **kwargs: any kwarg that is supported by nmos and pmos - """ - - #top level component - top_level = Component(name="flipped_voltage_follower") - - #two fets - device_map = { - "nmos": nmos, - "pmos": pmos, - } - device = device_map.get(device_type) - - if device_type == "nmos": - kwargs["with_dnwell"] = False # Set the parameter dynamically - - - fet_1 = device(pdk, width=width[0], fingers=fingers[0], multipliers=multipliers[0], with_dummy=dummy_1, with_substrate_tap=False, length=length[0], tie_layers=tie_layers1, sd_rmult=sd_rmult, **kwargs) - fet_2 = device(pdk, width=width[1], fingers=fingers[1], multipliers=multipliers[1], with_dummy=dummy_2, with_substrate_tap=False, length=length[1], tie_layers=tie_layers2, sd_rmult=sd_rmult, **kwargs) - well = "pwell" if device == nmos else "nwell" - fet_1_ref = top_level << fet_1 - fet_2_ref = top_level << fet_2 - - #Relative move - ref_dimensions = evaluate_bbox(fet_2) - if placement == "horizontal": - fet_2_ref.movex(fet_1_ref.xmax + ref_dimensions[0]/2 + pdk.util_max_metal_seperation()-0.5) - if placement == "vertical": - fet_2_ref.movey(fet_1_ref.ymin - ref_dimensions[1]/2 - pdk.util_max_metal_seperation()-1) - - #Routing - viam2m3 = via_stack(pdk, "met2", "met3", centered=True) - drain_1_via = top_level << viam2m3 - source_1_via = top_level << viam2m3 - drain_2_via = top_level << viam2m3 - gate_2_via = top_level << viam2m3 - drain_1_via.move(fet_1_ref.ports["multiplier_0_drain_W"].center).movex(-0.5*evaluate_bbox(fet_1)[1]) - source_1_via.move(fet_1_ref.ports["multiplier_0_source_E"].center).movex(1.5) - drain_2_via.move(fet_2_ref.ports["multiplier_0_drain_W"].center).movex(-1.5) - gate_2_via.move(fet_2_ref.ports["multiplier_0_gate_E"].center).movex(1) - - top_level << straight_route(pdk, fet_1_ref.ports["multiplier_0_source_E"], source_1_via.ports["bottom_met_W"]) - top_level << straight_route(pdk, fet_2_ref.ports["multiplier_0_drain_W"], drain_2_via.ports["bottom_met_E"]) - top_level << c_route(pdk, source_1_via.ports["top_met_N"], drain_2_via.ports["top_met_N"], extension=1.2*max(width[0],width[1]), e1glayer="met3", e2glayer="met3", cglayer="met2") - top_level << straight_route(pdk, fet_1_ref.ports["multiplier_0_drain_W"], drain_1_via.ports["bottom_met_E"]) - top_level << c_route(pdk, drain_1_via.ports["top_met_S"], gate_2_via.ports["top_met_S"], extension=1.2*max(width[0],width[1]), cglayer="met2") - top_level << straight_route(pdk, fet_2_ref.ports["multiplier_0_gate_E"], gate_2_via.ports["bottom_met_W"]) - try: - top_level << straight_route(pdk, fet_2_ref.ports["multiplier_0_source_W"], fet_2_ref.ports["tie_W_top_met_W"], glayer1=tie_layers2[1], width=0.2*sd_rmult, fullbottom=True) - except: - pass - #Renaming Ports - top_level.add_ports(fet_1_ref.get_ports_list(), prefix="A_") - top_level.add_ports(fet_2_ref.get_ports_list(), prefix="B_") - top_level.add_ports(drain_1_via.get_ports_list(), prefix="A_drain_") - top_level.add_ports(source_1_via.get_ports_list(), prefix="A_source_") - top_level.add_ports(drain_2_via.get_ports_list(), prefix="B_drain_") - top_level.add_ports(gate_2_via.get_ports_list(), prefix="B_gate_") - #add nwell - if well == "nwell": - top_level.add_padding(layers=(pdk.get_glayer("nwell"),),default= 1 ) - - component = component_snap_to_grid(rename_ports_by_orientation(top_level)) - #component = rename_ports_by_orientation(top_level) - - # Store netlist as string for LVS (avoids gymnasium info dict type restrictions) - # Compatible with both gdsfactory 7.7.0 and 7.16.0+ strict Pydantic validation - netlist_obj = fvf_netlist(fet_1, fet_2) - component.info['netlist'] = netlist_obj.generate_netlist() - # Store the Netlist object for hierarchical netlist building (used by lvcm.py etc.) - component.info['netlist_obj'] = netlist_obj - # Store serialized netlist data for reconstruction if needed - component.info['netlist_data'] = { - 'circuit_name': netlist_obj.circuit_name, - 'nodes': netlist_obj.nodes, - 'source_netlist': netlist_obj.source_netlist - } - - return component - -if __name__=="__main__": - fvf = sky130_add_fvf_labels(flipped_voltage_follower(sky130_mapped_pdk, width=(2,1), sd_rmult=3)) - fvf.show() - fvf.name = "fvf" - fvf_gds = fvf.write_gds("fvf.gds") - result = run_evaluation("fvf.gds",fvf.name,fvf) - print(result) \ No newline at end of file diff --git a/src/glayout/blocks/ATLAS/lvcm.py b/src/glayout/blocks/ATLAS/lvcm.py deleted file mode 100644 index 9bfb6091..00000000 --- a/src/glayout/blocks/ATLAS/lvcm.py +++ /dev/null @@ -1,201 +0,0 @@ -from glayout.pdk.mappedpdk import MappedPDK -from glayout.pdk.sky130_mapped import sky130_mapped_pdk -from gdsfactory.component import Component -from gdsfactory.component_reference import ComponentReference -from gdsfactory.cell import cell -from gdsfactory import Component -from gdsfactory.components import text_freetype, rectangle -from glayout.primitives.fet import nmos, pmos, multiplier -from glayout.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, prec_ref_center -from glayout.util.snap_to_grid import component_snap_to_grid -from glayout.util.port_utils import rename_ports_by_orientation -from glayout.routing.straight_route import straight_route -from glayout.routing.c_route import c_route -from glayout.routing.L_route import L_route -from glayout.primitives.guardring import tapring -from glayout.util.port_utils import add_ports_perimeter -from glayout.spice.netlist import Netlist -from fvf import fvf_netlist, flipped_voltage_follower # Import from local ATLAS fvf.py -from glayout.primitives.via_gen import via_stack -from typing import Optional -from evaluator_wrapper import run_evaluation - - -def add_lvcm_labels(lvcm_in: Component, - pdk: MappedPDK - ) -> Component: - - lvcm_in.unlock() - - met2_pin = (68,16) - met2_label = (68,5) - met3_pin = (69,16) - met3_label = (69,5) - # list that will contain all port/comp info - move_info = list() - # create labels and append to info list - # gnd - gndlabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.5,0.5),centered=True).copy() - gndlabel.add_label(text="GND",layer=pdk.get_glayer("met2_label")) - move_info.append((gndlabel,lvcm_in.ports["M_1_B_tie_N_top_met_N"],None)) - - #currentbias - ibias1label = rectangle(layer=pdk.get_glayer("met3_pin"),size=(0.5,0.5),centered=True).copy() - ibias1label.add_label(text="IBIAS1",layer=pdk.get_glayer("met3_label")) - move_info.append((ibias1label,lvcm_in.ports["M_1_A_drain_bottom_met_N"],None)) - - ibias2label = rectangle(layer=pdk.get_glayer("met3_pin"),size=(0.5,0.5),centered=True).copy() - ibias2label.add_label(text="IBIAS2",layer=pdk.get_glayer("met3_label")) - move_info.append((ibias2label,lvcm_in.ports["M_2_A_drain_bottom_met_N"],None)) - - # output - output1label = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - output1label.add_label(text="IOUT1",layer=pdk.get_glayer("met2_label")) - move_info.append((output1label,lvcm_in.ports["M_3_A_multiplier_0_drain_N"],None)) - - output2label = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - output2label.add_label(text="IOUT2",layer=pdk.get_glayer("met2_label")) - move_info.append((output2label,lvcm_in.ports["M_4_A_multiplier_0_drain_N"],None)) - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - compref = align_comp_to_port(comp, prt, alignment=alignment) - lvcm_in.add(compref) - return lvcm_in.flatten() - -def low_voltage_cmirr_netlist(bias_fvf: Component, cascode_fvf: Component, fet_1_ref: ComponentReference, fet_2_ref: ComponentReference, fet_3_ref: ComponentReference, fet_4_ref: ComponentReference) -> Netlist: - - netlist = Netlist(circuit_name='Low_voltage_current_mirror', nodes=['IBIAS1', 'IBIAS2', 'GND', 'IOUT1', 'IOUT2']) - # Use netlist_obj for hierarchical netlist building - netlist.connect_netlist(bias_fvf.info['netlist_obj'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib','IBIAS1'),('VOUT','local_net_1')]) - netlist.connect_netlist(cascode_fvf.info['netlist_obj'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib', 'IBIAS2'),('VOUT','local_net_2')]) - fet_1A_ref=netlist.connect_netlist(fet_2_ref.info['netlist'], [('D', 'IOUT1'),('G','IBIAS1'),('B','GND')]) - fet_2A_ref=netlist.connect_netlist(fet_4_ref.info['netlist'], [('D', 'IOUT2'),('G','IBIAS1'),('B','GND')]) - fet_1B_ref=netlist.connect_netlist(fet_1_ref.info['netlist'], [('G','IBIAS2'),('S', 'GND'),('B','GND')]) - fet_2B_ref=netlist.connect_netlist(fet_3_ref.info['netlist'], [('G','IBIAS2'),('S', 'GND'),('B','GND')]) - netlist.connect_subnets( - fet_1A_ref, - fet_1B_ref, - [('S', 'D')] - ) - netlist.connect_subnets( - fet_2A_ref, - fet_2B_ref, - [('S', 'D')] - ) - - return netlist - -@cell -def low_voltage_cmirror( - pdk: MappedPDK, - width: tuple[float,float] = (4.15,1.42), - length: float = 2, - fingers: tuple[int,int] = (2,1), - multipliers: tuple[int,int] = (1,1), - ) -> Component: - """ - A low voltage N type current mirror. It has two input brnaches and two output branches. It consists of total 8 nfets, 7 of them have the same W/L. One nfet has width of w' = w/3(theoretcially) - The default values are used to mirror 10uA. - """ - #top level component - top_level = Component("Low_voltage_N-type_current_mirror") - - #input branch 2 - cascode_fvf = flipped_voltage_follower(pdk, width=(width[0],width[0]), length=(length,length), fingers=(fingers[0],fingers[0]), multipliers=(multipliers[0],multipliers[0]), with_dnwell=False) - cascode_fvf_ref = prec_ref_center(cascode_fvf) - top_level.add(cascode_fvf_ref) - - #input branch 1 - bias_fvf = flipped_voltage_follower(pdk, width=(width[0],width[1]), length=(length,length), fingers=(fingers[0],fingers[1]), multipliers=(multipliers[0],multipliers[1]), placement="vertical", with_dnwell=False) - bias_fvf_ref = prec_ref_center(bias_fvf) - bias_fvf_ref.movey(cascode_fvf_ref.ymin - 2 - (evaluate_bbox(bias_fvf)[1]/2)) - top_level.add(bias_fvf_ref) - - #creating fets for output branches - fet_1 = nmos(pdk, width=width[0], fingers=fingers[0], multipliers=multipliers[0], with_dummy=True, with_dnwell=False, with_substrate_tap=False, length=length) - fet_1_ref = prec_ref_center(fet_1) - fet_2_ref = prec_ref_center(fet_1) - fet_3_ref = prec_ref_center(fet_1) - fet_4_ref = prec_ref_center(fet_1) - - fet_1_ref.movex(cascode_fvf_ref.xmin - (evaluate_bbox(fet_1)[0]/2) - pdk.util_max_metal_seperation()) - fet_2_ref.movex(cascode_fvf_ref.xmin - (3*evaluate_bbox(fet_1)[0]/2) - 2*pdk.util_max_metal_seperation()) - fet_3_ref.movex(cascode_fvf_ref.xmax + (evaluate_bbox(fet_1)[0]/2) + pdk.util_max_metal_seperation()) - fet_4_ref.movex(cascode_fvf_ref.xmax + (3*evaluate_bbox(fet_1)[0]/2) + 2*pdk.util_max_metal_seperation()) - - top_level.add(fet_1_ref) - top_level.add(fet_2_ref) - top_level.add(fet_3_ref) - top_level.add(fet_4_ref) - - top_level << c_route(pdk, bias_fvf_ref.ports["A_multiplier_0_gate_E"], bias_fvf_ref.ports["B_gate_bottom_met_E"]) - top_level << c_route(pdk, cascode_fvf_ref.ports["A_multiplier_0_gate_W"], bias_fvf_ref.ports["A_multiplier_0_gate_W"]) - top_level << straight_route(pdk, cascode_fvf_ref.ports["B_gate_bottom_met_E"], fet_3_ref.ports["multiplier_0_gate_W"]) - - #creating vias for routing - viam2m3 = via_stack(pdk, "met2", "met3", centered=True) - gate_1_via = top_level << viam2m3 - gate_1_via.move(fet_1_ref.ports["multiplier_0_gate_W"].center).movex(-1) - gate_2_via = top_level << viam2m3 - gate_2_via.move(fet_2_ref.ports["multiplier_0_gate_W"].center).movex(-1) - gate_3_via = top_level << viam2m3 - gate_3_via.move(fet_3_ref.ports["multiplier_0_gate_E"].center).movex(1) - gate_4_via = top_level << viam2m3 - gate_4_via.move(fet_4_ref.ports["multiplier_0_gate_E"].center).movex(1) - - source_2_via = top_level << viam2m3 - drain_1_via = top_level << viam2m3 - source_2_via.move(fet_2_ref.ports["multiplier_0_source_E"].center).movex(1.5) - drain_1_via.move(fet_1_ref.ports["multiplier_0_drain_W"].center).movex(-1) - - source_4_via = top_level << viam2m3 - drain_3_via = top_level << viam2m3 - source_4_via.move(fet_4_ref.ports["multiplier_0_source_W"].center).movex(-1) - drain_3_via.move(fet_3_ref.ports["multiplier_0_drain_E"].center).movex(1.5) - - #routing - top_level << straight_route(pdk, fet_2_ref.ports["multiplier_0_source_E"], source_2_via.ports["bottom_met_W"]) - top_level << straight_route(pdk, fet_1_ref.ports["multiplier_0_drain_W"], drain_1_via.ports["bottom_met_E"]) - top_level << straight_route(pdk, fet_4_ref.ports["multiplier_0_source_W"], source_4_via.ports["bottom_met_E"]) - top_level << straight_route(pdk, fet_3_ref.ports["multiplier_0_drain_E"], drain_3_via.ports["bottom_met_W"]) - top_level << c_route(pdk, source_2_via.ports["top_met_N"], drain_1_via.ports["top_met_N"], extension=0.5*evaluate_bbox(fet_1)[1], width1=0.32, width2=0.32, cwidth=0.32, e1glayer="met3", e2glayer="met3", cglayer="met2") - top_level << c_route(pdk, source_4_via.ports["top_met_N"], drain_3_via.ports["top_met_N"], extension=0.5*evaluate_bbox(fet_1)[1], width1=0.32, width2=0.32, cwidth=0.32, e1glayer="met3", e2glayer="met3", cglayer="met2") - top_level << c_route(pdk, bias_fvf_ref.ports["A_multiplier_0_gate_E"], gate_4_via.ports["bottom_met_E"], width1=0.32, width2=0.32, cwidth=0.32) - - - top_level << straight_route(pdk, fet_1_ref.ports["multiplier_0_gate_W"], gate_1_via.ports["bottom_met_E"]) - top_level << straight_route(pdk, fet_2_ref.ports["multiplier_0_gate_W"], gate_2_via.ports["bottom_met_E"]) - top_level << straight_route(pdk, fet_3_ref.ports["multiplier_0_gate_E"], gate_3_via.ports["bottom_met_W"]) - top_level << straight_route(pdk, fet_4_ref.ports["multiplier_0_gate_E"], gate_4_via.ports["bottom_met_W"]) - - top_level << c_route(pdk, gate_1_via.ports["top_met_S"], gate_3_via.ports["top_met_S"], extension=(1.2*width[0]+0.6), cglayer='met2') - top_level << c_route(pdk, gate_2_via.ports["top_met_S"], gate_4_via.ports["top_met_S"], extension=(1.2*width[0]-0.6), cglayer='met2') - - top_level << straight_route(pdk, fet_1_ref.ports["multiplier_0_source_W"], fet_1_ref.ports["tie_W_top_met_W"], glayer1='met1', width=0.2) - top_level << straight_route(pdk, fet_3_ref.ports["multiplier_0_source_W"], fet_3_ref.ports["tie_W_top_met_W"], glayer1='met1', width=0.2) - - - top_level.add_ports(bias_fvf_ref.get_ports_list(), prefix="M_1_") - top_level.add_ports(cascode_fvf_ref.get_ports_list(), prefix="M_2_") - top_level.add_ports(fet_1_ref.get_ports_list(), prefix="M_3_B_") - top_level.add_ports(fet_2_ref.get_ports_list(), prefix="M_3_A_") - top_level.add_ports(fet_3_ref.get_ports_list(), prefix="M_4_B_") - top_level.add_ports(fet_4_ref.get_ports_list(), prefix="M_4_A_") - - component = component_snap_to_grid(rename_ports_by_orientation(top_level)) - netlist_obj = low_voltage_cmirr_netlist(bias_fvf, cascode_fvf, fet_1_ref, fet_2_ref, fet_3_ref, fet_4_ref) - component.info['netlist'] = netlist_obj.generate_netlist() - - return component - -if __name__=="__main__": - #low_voltage_current_mirror = low_voltage_current_mirror(sky130_mapped_pdk) - low_voltage_current_mirror = add_lvcm_labels(low_voltage_cmirror(sky130_mapped_pdk),sky130_mapped_pdk) - low_voltage_current_mirror.show() - low_voltage_current_mirror.name = "Low_voltage_current_mirror" - #magic_drc_result = sky130_mapped_pdk.drc_magic(low_voltage_current_mirror, low_voltage_current_mirror.name) - #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(low_voltage_current_mirror, low_voltage_current_mirror.name) - low_voltage_current_mirror_gds = low_voltage_current_mirror.write_gds("low_voltage_current_mirror.gds") - res = run_evaluation("low_voltage_current_mirror.gds", low_voltage_current_mirror.name, low_voltage_current_mirror) \ No newline at end of file diff --git a/src/glayout/blocks/ATLAS/transmission_gate.py b/src/glayout/blocks/ATLAS/transmission_gate.py deleted file mode 100644 index 5285c484..00000000 --- a/src/glayout/blocks/ATLAS/transmission_gate.py +++ /dev/null @@ -1,173 +0,0 @@ -from glayout.pdk.mappedpdk import MappedPDK -from glayout.pdk.sky130_mapped import sky130_mapped_pdk -from gdsfactory.cell import cell -from gdsfactory.component import Component -from gdsfactory import Component -from glayout.primitives.fet import nmos, pmos, multiplier -from glayout.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, movex, movey -from glayout.util.snap_to_grid import component_snap_to_grid -from glayout.util.port_utils import rename_ports_by_orientation -from glayout.routing.straight_route import straight_route -from glayout.routing.c_route import c_route -from glayout.routing.L_route import L_route -from glayout.primitives.guardring import tapring -from glayout.util.port_utils import add_ports_perimeter -from glayout.spice.netlist import Netlist -from glayout.primitives.via_gen import via_stack -from gdsfactory.components import text_freetype, rectangle -try: - from evaluator_wrapper import run_evaluation # pyright: ignore[reportMissingImports] -except ImportError: - print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") - run_evaluation = None - -def add_tg_labels(tg_in: Component, - pdk: MappedPDK - ) -> Component: - - tg_in.unlock() - met2_pin = (68,16) - met2_label = (68,5) - # list that will contain all port/comp info - move_info = list() - # create labels and append to info list - # vin - vinlabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vinlabel.add_label(text="VIN",layer=pdk.get_glayer("met2_label")) - move_info.append((vinlabel,tg_in.ports["N_multiplier_0_source_E"],None)) - - # vout - voutlabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - voutlabel.add_label(text="VOUT",layer=pdk.get_glayer("met2_label")) - move_info.append((voutlabel,tg_in.ports["P_multiplier_0_drain_W"],None)) - - # vcc - vcclabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.5,0.5),centered=True).copy() - vcclabel.add_label(text="VCC",layer=pdk.get_glayer("met2_label")) - move_info.append((vcclabel,tg_in.ports["P_tie_S_top_met_S"],None)) - - # vss - vsslabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.5,0.5),centered=True).copy() - vsslabel.add_label(text="VSS",layer=pdk.get_glayer("met2_label")) - move_info.append((vsslabel,tg_in.ports["N_tie_S_top_met_N"], None)) - - # VGP - vgplabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vgplabel.add_label(text="VGP",layer=pdk.get_glayer("met2_label")) - move_info.append((vgplabel,tg_in.ports["P_multiplier_0_gate_E"], None)) - - # VGN - vgnlabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() - vgnlabel.add_label(text="VGN",layer=pdk.get_glayer("met2_label")) - move_info.append((vgnlabel,tg_in.ports["N_multiplier_0_gate_E"], None)) - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - compref = align_comp_to_port(comp, prt, alignment=alignment) - tg_in.add(compref) - return tg_in.flatten() - - -def get_component_netlist(component) -> Netlist: - """Helper function to extract netlist from component with version compatibility""" - if hasattr(component.info, 'get'): - # Check if netlist object is stored directly - if 'netlist' in component.info: - netlist_obj = component.info['netlist'] - if isinstance(netlist_obj, str): - # It's a string representation, try to reconstruct - # For gymnasium compatibility, we don't store netlist_data, so create a simple netlist - return Netlist(source_netlist=netlist_obj) - else: - # It's already a Netlist object - return netlist_obj - - # Fallback: return empty netlist - return Netlist() - -def tg_netlist(nfet: Component, pfet: Component) -> Netlist: - """Generate SPICE netlist for transmission gate using proper Netlist class""" - - netlist = Netlist(circuit_name='Transmission_Gate', nodes=['VIN', 'VSS', 'VOUT', 'VCC', 'VGP', 'VGN']) - - # Get netlist objects from FET components - nfet_netlist = get_component_netlist(nfet) - pfet_netlist = get_component_netlist(pfet) - - # Connect NMOS: D->VOUT, G->VGN, S->VIN, B->VSS - netlist.connect_netlist(nfet_netlist, [('D', 'VOUT'), ('G', 'VGN'), ('S', 'VIN'), ('B', 'VSS')]) - # Connect PMOS: D->VOUT, G->VGP, S->VIN, B->VCC - netlist.connect_netlist(pfet_netlist, [('D', 'VOUT'), ('G', 'VGP'), ('S', 'VIN'), ('B', 'VCC')]) - - return netlist - -@cell -def transmission_gate( - pdk: MappedPDK, - width: tuple[float,float] = (1,1), - length: tuple[float,float] = (None,None), - fingers: tuple[int,int] = (1,1), - multipliers: tuple[int,int] = (1,1), - substrate_tap: bool = False, - tie_layers: tuple[str,str] = ("met2","met1"), - **kwargs - ) -> Component: - """ - creates a transmission gate - tuples are in (NMOS,PMOS) order - **kwargs are any kwarg that is supported by nmos and pmos - """ - - #top level component - top_level = Component(name="transmission_gate") - - #two fets - nfet = nmos(pdk, width=width[0], fingers=fingers[0], multipliers=multipliers[0], with_dummy=True, with_dnwell=False, with_substrate_tap=False, length=length[0], **kwargs) - pfet = pmos(pdk, width=width[1], fingers=fingers[1], multipliers=multipliers[1], with_dummy=True, with_substrate_tap=False, length=length[1], **kwargs) - nfet_ref = top_level << nfet - pfet_ref = top_level << pfet - pfet_ref = rename_ports_by_orientation(pfet_ref.mirror_y()) - - #Relative move - pfet_ref.movey(nfet_ref.ymax + evaluate_bbox(pfet_ref)[1]/2 + pdk.util_max_metal_seperation()) - - #Routing - top_level << c_route(pdk, nfet_ref.ports["multiplier_0_source_E"], pfet_ref.ports["multiplier_0_source_E"]) - top_level << c_route(pdk, nfet_ref.ports["multiplier_0_drain_W"], pfet_ref.ports["multiplier_0_drain_W"], viaoffset=False) - - #Renaming Ports - top_level.add_ports(nfet_ref.get_ports_list(), prefix="N_") - top_level.add_ports(pfet_ref.get_ports_list(), prefix="P_") - - #substrate tap - if substrate_tap: - substrate_tap_encloses =((evaluate_bbox(top_level)[0]+pdk.util_max_metal_seperation()), (evaluate_bbox(top_level)[1]+pdk.util_max_metal_seperation())) - guardring_ref = top_level << tapring( - pdk, - enclosed_rectangle=substrate_tap_encloses, - sdlayer="p+s/d", - horizontal_glayer='met2', - vertical_glayer='met1', - ) - guardring_ref.move(nfet_ref.center).movey(evaluate_bbox(pfet_ref)[1]/2 + pdk.util_max_metal_seperation()/2) - top_level.add_ports(guardring_ref.get_ports_list(),prefix="tap_") - - component = component_snap_to_grid(rename_ports_by_orientation(top_level)) - - # Generate netlist using proper Netlist class - netlist_obj = tg_netlist(nfet, pfet) - - # Store netlist - LVS method handles both string and Netlist objects - component.info['netlist'] = netlist_obj - - return component - -if __name__=="__main__": - transmission_gate = add_tg_labels(transmission_gate(sky130_mapped_pdk),sky130_mapped_pdk) - transmission_gate.show() - transmission_gate.name = "Transmission_Gate" - #magic_drc_result = sky130_mapped_pdk.drc_magic(transmission_gate, transmission_gate.name) - #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(transmission_gate, transmission_gate.name) - transmission_gate_gds = transmission_gate.write_gds("transmission_gate.gds") - res = run_evaluation("transmission_gate.gds", transmission_gate.name, transmission_gate) \ No newline at end of file From 5e902223f12fcf97eda841f5dd41082d7abe29f6 Mon Sep 17 00:00:00 2001 From: Aditya Kak Date: Tue, 3 Feb 2026 16:24:21 +0000 Subject: [PATCH 4/5] renamed opamp wrapper in ATLAS/ --- .../ATLAS/{opamp.py => opamp_wrapper.py} | 0 .../fvf_based_ota/low_voltage_cmirror.py | 28 +- .../blocks/composite/fvf_based_ota/n_block.py | 28 +- .../blocks/composite/fvf_based_ota/ota.py | 32 +- .../blocks/composite/fvf_based_ota/p_block.py | 28 +- .../fvf_based_ota/sky130_ota_tapeout.py | 32 +- .../composite/low_voltage_cmirror/__init__.py | 2 +- .../low_voltage_cmirror.py | 58 +- .../blocks/composite/opamp/__init__.py | 4 +- .../opamp/diff_pair_stackedcmirror.py | 34 +- src/glayout/blocks/composite/opamp/opamp.py | 32 +- .../blocks/composite/opamp/opamp_twostage.py | 42 +- ...mplifier_diff_to_single_ended_converter.py | 28 +- src/glayout/blocks/elementary/FVF/__init__.py | 2 +- src/glayout/blocks/elementary/FVF/els | 20 + .../elementary/FVF/evaluator_wrapper.py | 76 - src/glayout/blocks/elementary/FVF/fvf.cdl | 1 - src/glayout/blocks/elementary/FVF/fvf.ext | 28 + src/glayout/blocks/elementary/FVF/fvf.nodes | 3 + src/glayout/blocks/elementary/FVF/fvf.py | 129 +- src/glayout/blocks/elementary/FVF/fvf.res.ext | 1873 +++++++++++++++++ src/glayout/blocks/elementary/FVF/fvf.sim | 19 + .../FVF/fvf_drc_out/drc/fvf/fvf.rpt | 21 + .../FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt | 58 + .../blocks/elementary/FVF/fvf_pex.spice | 1173 +++++++++++ .../elementary/FVF/physical_features.py | 111 - src/glayout/blocks/elementary/FVF/run_pex.sh | 24 - .../blocks/elementary/FVF/sky130A.magicrc | 86 - .../blocks/elementary/FVF/verification.py | 174 -- .../current_mirror/current_mirror.py | 177 +- .../blocks/elementary/diff_pair/diff_pair.py | 253 +-- .../transmission_gate/transmission_gate.py | 6 +- .../blocks/evaluator_box/evaluator_wrapper.py | 25 +- .../blocks/evaluator_box/physical_features.py | 19 +- src/glayout/blocks/evaluator_box/run_pex.sh | 12 +- .../blocks/evaluator_box/verification.py | 37 +- src/glayout/pdk/mappedpdk.py | 3 + 37 files changed, 3588 insertions(+), 1090 deletions(-) rename src/glayout/blocks/ATLAS/{opamp.py => opamp_wrapper.py} (100%) create mode 100644 src/glayout/blocks/elementary/FVF/els delete mode 100644 src/glayout/blocks/elementary/FVF/evaluator_wrapper.py delete mode 100644 src/glayout/blocks/elementary/FVF/fvf.cdl create mode 100644 src/glayout/blocks/elementary/FVF/fvf.ext create mode 100644 src/glayout/blocks/elementary/FVF/fvf.nodes create mode 100644 src/glayout/blocks/elementary/FVF/fvf.res.ext create mode 100644 src/glayout/blocks/elementary/FVF/fvf.sim create mode 100644 src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt create mode 100644 src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt create mode 100644 src/glayout/blocks/elementary/FVF/fvf_pex.spice delete mode 100644 src/glayout/blocks/elementary/FVF/physical_features.py delete mode 100755 src/glayout/blocks/elementary/FVF/run_pex.sh delete mode 100644 src/glayout/blocks/elementary/FVF/sky130A.magicrc delete mode 100644 src/glayout/blocks/elementary/FVF/verification.py diff --git a/src/glayout/blocks/ATLAS/opamp.py b/src/glayout/blocks/ATLAS/opamp_wrapper.py similarity index 100% rename from src/glayout/blocks/ATLAS/opamp.py rename to src/glayout/blocks/ATLAS/opamp_wrapper.py diff --git a/src/glayout/blocks/composite/fvf_based_ota/low_voltage_cmirror.py b/src/glayout/blocks/composite/fvf_based_ota/low_voltage_cmirror.py index 61f8ff8a..5a6b5122 100644 --- a/src/glayout/blocks/composite/fvf_based_ota/low_voltage_cmirror.py +++ b/src/glayout/blocks/composite/fvf_based_ota/low_voltage_cmirror.py @@ -1,22 +1,22 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.component import Component from gdsfactory.component_reference import ComponentReference from gdsfactory.cell import cell from gdsfactory import Component from gdsfactory.components import text_freetype, rectangle -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, prec_ref_center -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.primitives.guardring import tapring -from glayout.flow.pdk.util.port_utils import add_ports_perimeter -from glayout.flow.spice.netlist import Netlist -from glayout.flow.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower -from glayout.flow.primitives.via_gen import via_stack +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, prec_ref_center +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.primitives.guardring import tapring +from glayout.util.port_utils import add_ports_perimeter +from glayout.spice.netlist import Netlist +from glayout.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower +from glayout.primitives.via_gen import via_stack from typing import Optional def add_lvcm_labels(lvcm_in: Component, diff --git a/src/glayout/blocks/composite/fvf_based_ota/n_block.py b/src/glayout/blocks/composite/fvf_based_ota/n_block.py index 0a0ebdbb..af02e0e7 100644 --- a/src/glayout/blocks/composite/fvf_based_ota/n_block.py +++ b/src/glayout/blocks/composite/fvf_based_ota/n_block.py @@ -1,23 +1,23 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory import Component from gdsfactory.cell import cell from gdsfactory.component_reference import ComponentReference -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, prec_center, align_comp_to_port -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, prec_center, align_comp_to_port +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.util.snap_to_grid import component_snap_to_grid from gdsfactory.components import text_freetype, rectangle -from glayout.flow.spice.netlist import Netlist -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower -from glayout.flow.blocks.elementary.current_mirror.current_mirror import current_mirror, current_mirror_netlist -from glayout.flow.primitives.via_gen import via_stack, via_array -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.blocks.composite.fvf_based_ota.low_voltage_cmirror import low_voltage_cmirror, low_voltage_cmirr_netlist +from glayout.spice.netlist import Netlist +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower +from glayout.blocks.elementary.current_mirror.current_mirror import current_mirror, current_mirror_netlist +from glayout.primitives.via_gen import via_stack, via_array +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.blocks.composite.fvf_based_ota.low_voltage_cmirror import low_voltage_cmirror, low_voltage_cmirr_netlist def n_block_netlist(fet_inA_ref: ComponentReference, fet_inB_ref: ComponentReference, fvf_1_ref: ComponentReference, fvf_2_ref: ComponentReference, cmirror: Component, global_c_bias: Component) -> Netlist: diff --git a/src/glayout/blocks/composite/fvf_based_ota/ota.py b/src/glayout/blocks/composite/fvf_based_ota/ota.py index 87bcacc9..b8ffba78 100644 --- a/src/glayout/blocks/composite/fvf_based_ota/ota.py +++ b/src/glayout/blocks/composite/fvf_based_ota/ota.py @@ -1,26 +1,26 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory import Component from gdsfactory.cell import cell from gdsfactory.component_reference import ComponentReference -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, prec_center, align_comp_to_port -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, prec_center, align_comp_to_port +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.util.snap_to_grid import component_snap_to_grid from gdsfactory.components import text_freetype, rectangle -from glayout.flow.spice.netlist import Netlist +from glayout.spice.netlist import Netlist -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower -from glayout.flow.blocks.elementary.current_mirror.current_mirror import current_mirror, current_mirror_netlist -from glayout.flow.primitives.via_gen import via_stack, via_array -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.blocks.elementary.transmission_gate.transmission_gate import transmission_gate,tg_netlist -from glayout.flow.blocks.composite.fvf_based_ota.p_block import p_block,p_block_netlist -from glayout.flow.blocks.composite.fvf_based_ota.n_block import n_block,n_block_netlist +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower +from glayout.blocks.elementary.current_mirror.current_mirror import current_mirror, current_mirror_netlist +from glayout.primitives.via_gen import via_stack, via_array +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.blocks.elementary.transmission_gate.transmission_gate import transmission_gate,tg_netlist +from glayout.blocks.composite.fvf_based_ota.p_block import p_block,p_block_netlist +from glayout.blocks.composite.fvf_based_ota.n_block import n_block,n_block_netlist def super_class_AB_OTA_netlist(local_c_bias_1_ref: ComponentReference, local_c_bias_2_ref: ComponentReference, res_1_ref: ComponentReference, res_2_ref: ComponentReference, nb: Component, pblock: Component) -> Netlist: diff --git a/src/glayout/blocks/composite/fvf_based_ota/p_block.py b/src/glayout/blocks/composite/fvf_based_ota/p_block.py index 17e4f05c..db67187e 100644 --- a/src/glayout/blocks/composite/fvf_based_ota/p_block.py +++ b/src/glayout/blocks/composite/fvf_based_ota/p_block.py @@ -1,22 +1,22 @@ -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.cell import cell from gdsfactory.component import Component from gdsfactory.component_reference import ComponentReference from gdsfactory import Component -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.L_route import L_route -from glayout.flow.primitives.guardring import tapring -from glayout.flow.pdk.util.port_utils import add_ports_perimeter, rename_ports_by_list -from glayout.flow.spice.netlist import Netlist -from glayout.flow.primitives.via_gen import via_stack +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center +from glayout.util.snap_to_grid import component_snap_to_grid +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.primitives.guardring import tapring +from glayout.util.port_utils import add_ports_perimeter, rename_ports_by_list +from glayout.spice.netlist import Netlist +from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle -from glayout.flow.placement.four_transistor_interdigitized import generic_4T_interdigitzed +from glayout.placement.four_transistor_interdigitized import generic_4T_interdigitzed def p_block_netlist(pdk: MappedPDK, pblock: tuple[float, float, int]) -> Netlist: return Netlist( diff --git a/src/glayout/blocks/composite/fvf_based_ota/sky130_ota_tapeout.py b/src/glayout/blocks/composite/fvf_based_ota/sky130_ota_tapeout.py index c5eb5230..fb86231c 100644 --- a/src/glayout/blocks/composite/fvf_based_ota/sky130_ota_tapeout.py +++ b/src/glayout/blocks/composite/fvf_based_ota/sky130_ota_tapeout.py @@ -6,20 +6,20 @@ from gdsfactory.read.import_gds import import_gds from gdsfactory.components import text_freetype, rectangle -from glayout.flow.pdk.util.comp_utils import prec_array, movey, align_comp_to_port, prec_ref_center -from glayout.flow.pdk.util.port_utils import add_ports_perimeter, print_ports +from glayout.util.comp_utils import prec_array, movey, align_comp_to_port, prec_ref_center +from glayout.util.port_utils import add_ports_perimeter, print_ports from gdsfactory.component import Component -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.blocks.composite.fvf_based_ota.ota import super_class_AB_OTA -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.c_route import c_route -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, prec_center, align_comp_to_port -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.pdk.mappedpdk import MappedPDK +from glayout.blocks.composite.fvf_based_ota.ota import super_class_AB_OTA +from glayout.routing.L_route import L_route +from glayout.routing.c_route import c_route +from glayout.routing.straight_route import straight_route +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, prec_center, align_comp_to_port +from glayout.util.port_utils import rename_ports_by_orientation +from glayout.util.snap_to_grid import component_snap_to_grid from gdsfactory.components import text_freetype, rectangle -from glayout.flow.pdk.mappedpdk import MappedPDK -from glayout.flow.primitives.via_gen import via_array, via_stack +from glayout.pdk.mappedpdk import MappedPDK +from glayout.primitives.via_gen import via_array, via_stack from gdsfactory.cell import cell, clear_cache import numpy as np from subprocess import Popen @@ -38,9 +38,9 @@ from sklearn.cluster import KMeans, AgglomerativeClustering from sklearn.metrics import silhouette_score import argparse -from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk as pdk +from glayout.pdk.sky130_mapped import sky130_mapped_pdk as pdk from itertools import count, repeat -from glayout.flow.pdk.util.component_array_create import write_component_matrix +from glayout.util.component_array_create import write_component_matrix import re import pickle import tempfile @@ -611,7 +611,7 @@ def single_build_and_simulation(parameters: np.array, temp: int=25, output_dir: saves ota gds in current directory with name 12345678987654321.gds returns -987.654321 for all values IF phase margin < 60 """ - from glayout.flow.pdk.sky130_mapped import sky130_mapped_pdk + from glayout.pdk.sky130_mapped import sky130_mapped_pdk # process temperature info temperature_info = [temp, None] if temperature_info[0] > -20: @@ -810,7 +810,7 @@ def get_parameter_value(param_name: str, *args, **kwargs): elif args.mode == "gen_otas": global usepdk if args.pdk[0].lower()=="g": - from glayout.flow.pdk.gf180_mapped import gf180_mapped_pdk + from glayout.pdk.gf180_mapped import gf180_mapped_pdk usepdk = gf180_mapped_pdk else: usepdk = pdk diff --git a/src/glayout/blocks/composite/low_voltage_cmirror/__init__.py b/src/glayout/blocks/composite/low_voltage_cmirror/__init__.py index 7fa87ec0..c2f48562 100644 --- a/src/glayout/blocks/composite/low_voltage_cmirror/__init__.py +++ b/src/glayout/blocks/composite/low_voltage_cmirror/__init__.py @@ -1 +1 @@ -from glayout.blocks.elementary.low_voltage_cmirror.low_voltage_cmirror import low_voltage_cmirror, low_voltage_cmirr_netlist \ No newline at end of file +from glayout.blocks.composite.low_voltage_cmirror.low_voltage_cmirror import low_voltage_cmirror, low_voltage_cmirr_netlist \ No newline at end of file diff --git a/src/glayout/blocks/composite/low_voltage_cmirror/low_voltage_cmirror.py b/src/glayout/blocks/composite/low_voltage_cmirror/low_voltage_cmirror.py index b88bd077..40973eca 100644 --- a/src/glayout/blocks/composite/low_voltage_cmirror/low_voltage_cmirror.py +++ b/src/glayout/blocks/composite/low_voltage_cmirror/low_voltage_cmirror.py @@ -1,27 +1,36 @@ -from glayout import MappedPDK, sky130,gf180 -from glayout import nmos, pmos, tapring,via_stack -from glayout.spice.netlist import Netlist -from glayout.routing import c_route,L_route,straight_route +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.component import Component from gdsfactory.component_reference import ComponentReference from gdsfactory.cell import cell from gdsfactory import Component from gdsfactory.components import text_freetype, rectangle +from glayout.primitives.fet import nmos, pmos, multiplier from glayout.util.comp_utils import evaluate_bbox, prec_center, align_comp_to_port, prec_ref_center from glayout.util.snap_to_grid import component_snap_to_grid from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.primitives.guardring import tapring from glayout.util.port_utils import add_ports_perimeter -from glayout.blocks.elementary.FVF import fvf_netlist, flipped_voltage_follower - +from glayout.spice.netlist import Netlist +from glayout.blocks.elementary.FVF.fvf import fvf_netlist, flipped_voltage_follower # Import from local ATLAS fvf.py from glayout.primitives.via_gen import via_stack from typing import Optional -import time +from glayout.blocks.evaluator_box.evaluator_wrapper import run_evaluation + def add_lvcm_labels(lvcm_in: Component, pdk: MappedPDK ) -> Component: lvcm_in.unlock() + + met2_pin = (68,16) + met2_label = (68,5) + met3_pin = (69,16) + met3_label = (69,5) # list that will contain all port/comp info move_info = list() # create labels and append to info list @@ -58,8 +67,9 @@ def add_lvcm_labels(lvcm_in: Component, def low_voltage_cmirr_netlist(bias_fvf: Component, cascode_fvf: Component, fet_1_ref: ComponentReference, fet_2_ref: ComponentReference, fet_3_ref: ComponentReference, fet_4_ref: ComponentReference) -> Netlist: netlist = Netlist(circuit_name='Low_voltage_current_mirror', nodes=['IBIAS1', 'IBIAS2', 'GND', 'IOUT1', 'IOUT2']) - netlist.connect_netlist(bias_fvf.info['netlist'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib','IBIAS1'),('VOUT','local_net_1')]) - netlist.connect_netlist(cascode_fvf.info['netlist'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib', 'IBIAS2'),('VOUT','local_net_2')]) + # Use netlist_obj for hierarchical netlist building + netlist.connect_netlist(bias_fvf.info['netlist_obj'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib','IBIAS1'),('VOUT','local_net_1')]) + netlist.connect_netlist(cascode_fvf.info['netlist_obj'], [('VIN','IBIAS1'),('VBULK','GND'),('Ib', 'IBIAS2'),('VOUT','local_net_2')]) fet_1A_ref=netlist.connect_netlist(fet_2_ref.info['netlist'], [('D', 'IOUT1'),('G','IBIAS1'),('B','GND')]) fet_2A_ref=netlist.connect_netlist(fet_4_ref.info['netlist'], [('D', 'IOUT2'),('G','IBIAS1'),('B','GND')]) fet_1B_ref=netlist.connect_netlist(fet_1_ref.info['netlist'], [('G','IBIAS2'),('S', 'GND'),('B','GND')]) @@ -175,25 +185,17 @@ def low_voltage_cmirror( top_level.add_ports(fet_4_ref.get_ports_list(), prefix="M_4_A_") component = component_snap_to_grid(rename_ports_by_orientation(top_level)) - component.info['netlist'] = low_voltage_cmirr_netlist(bias_fvf, cascode_fvf, fet_1_ref, fet_2_ref, fet_3_ref, fet_4_ref) + netlist_obj = low_voltage_cmirr_netlist(bias_fvf, cascode_fvf, fet_1_ref, fet_2_ref, fet_3_ref, fet_4_ref) + component.info['netlist'] = netlist_obj.generate_netlist() return component -if __name__ == "__main__": - comp =low_voltage_cmirror(sky130) - # comp.pprint_ports() - comp =add_lvcm_labels(comp,sky130) - comp.name = "LVCM" - comp.show() - #print(comp.info['netlist'].generate_netlist()) - print("...Running DRC...") - drc_result = sky130.drc_magic(comp, "LVCM") - ## Klayout DRC - #drc_result = sky130.drc(comp) - - time.sleep(5) - - print("...Running LVS...") - lvs_res=sky130.lvs_netgen(comp, "LVCM") - #print("...Saving GDS...") - #comp.write_gds('out_LVCM.gds') +if __name__=="__main__": + #low_voltage_current_mirror = low_voltage_current_mirror(sky130_mapped_pdk) + low_voltage_current_mirror = add_lvcm_labels(low_voltage_cmirror(sky130_mapped_pdk),sky130_mapped_pdk) + low_voltage_current_mirror.show() + low_voltage_current_mirror.name = "Low_voltage_current_mirror" + #magic_drc_result = sky130_mapped_pdk.drc_magic(low_voltage_current_mirror, low_voltage_current_mirror.name) + #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(low_voltage_current_mirror, low_voltage_current_mirror.name) + low_voltage_current_mirror_gds = low_voltage_current_mirror.write_gds("low_voltage_current_mirror.gds") + res = run_evaluation("low_voltage_current_mirror.gds", low_voltage_current_mirror.name, low_voltage_current_mirror) \ No newline at end of file diff --git a/src/glayout/blocks/composite/opamp/__init__.py b/src/glayout/blocks/composite/opamp/__init__.py index 48801bcb..ee1d6902 100644 --- a/src/glayout/blocks/composite/opamp/__init__.py +++ b/src/glayout/blocks/composite/opamp/__init__.py @@ -1,2 +1,2 @@ -from glayout.flow.blocks.composite.opamp.opamp import opamp, opamp_netlist -from glayout.flow.blocks.composite.opamp.diff_pair_stackedcmirror import diff_pair_stackedcmirror \ No newline at end of file +from glayout.blocks.composite.opamp.opamp import opamp, opamp_netlist +from glayout.blocks.composite.opamp.diff_pair_stackedcmirror import diff_pair_stackedcmirror \ No newline at end of file diff --git a/src/glayout/blocks/composite/opamp/diff_pair_stackedcmirror.py b/src/glayout/blocks/composite/opamp/diff_pair_stackedcmirror.py index e366146a..6b42b27c 100644 --- a/src/glayout/blocks/composite/opamp/diff_pair_stackedcmirror.py +++ b/src/glayout/blocks/composite/opamp/diff_pair_stackedcmirror.py @@ -2,27 +2,27 @@ from gdsfactory.component import Component, copy from gdsfactory.component_reference import ComponentReference from gdsfactory.components.rectangle import rectangle -from glayout.flow.pdk.mappedpdk import MappedPDK +from glayout.pdk.mappedpdk import MappedPDK from typing import Optional, Union -from glayout.flow.blocks.elementary.diff_pair import diff_pair -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.primitives.guardring import tapring -from glayout.flow.primitives.mimcap import mimcap_array, mimcap -from glayout.flow.primitives.via_gen import via_stack, via_array -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.c_route_old import c_route +from glayout.blocks.elementary.diff_pair import diff_pair +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.primitives.guardring import tapring +from glayout.primitives.mimcap import mimcap_array, mimcap +from glayout.primitives.via_gen import via_stack, via_array +from glayout.routing.L_route import L_route +from glayout.routing.c_route import c_route from gdsfactory.routing.route_quad import route_quad -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc +from glayout.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports +from glayout.routing.straight_route import straight_route +from glayout.util.snap_to_grid import component_snap_to_grid from pydantic import validate_arguments -from glayout.flow.placement.two_transistor_interdigitized import two_nfet_interdigitized +from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized -from glayout.flow.blocks.composite.diffpair_cmirror_bias import diff_pair_ibias -from glayout.flow.blocks.composite.stacked_current_mirror import stacked_nfet_current_mirror -from glayout.flow.blocks.composite.differential_to_single_ended_converter import differential_to_single_ended_converter -from glayout.flow.blocks.composite.opamp.row_csamplifier_diff_to_single_ended_converter import row_csamplifier_diff_to_single_ended_converter +from glayout.blocks.composite.diffpair_cmirror_bias import diff_pair_ibias +from glayout.blocks.composite.stacked_current_mirror import stacked_nfet_current_mirror +from glayout.blocks.composite.differential_to_single_ended_converter import differential_to_single_ended_converter +from glayout.blocks.composite.opamp.row_csamplifier_diff_to_single_ended_converter import row_csamplifier_diff_to_single_ended_converter @validate_arguments diff --git a/src/glayout/blocks/composite/opamp/opamp.py b/src/glayout/blocks/composite/opamp/opamp.py index 8fdf6208..03adf612 100644 --- a/src/glayout/blocks/composite/opamp/opamp.py +++ b/src/glayout/blocks/composite/opamp/opamp.py @@ -2,26 +2,26 @@ from gdsfactory.component import Component, copy from gdsfactory.component_reference import ComponentReference from gdsfactory.components.rectangle import rectangle -from glayout.flow.pdk.mappedpdk import MappedPDK +from glayout.pdk.mappedpdk import MappedPDK from typing import Optional, Union -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.blocks.elementary.diff_pair import diff_pair -from glayout.flow.primitives.guardring import tapring -from glayout.flow.primitives.mimcap import mimcap_array, mimcap -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.c_route_old import c_route -from glayout.flow.primitives.via_gen import via_stack, via_array +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.blocks.elementary.diff_pair import diff_pair +from glayout.primitives.guardring import tapring +from glayout.primitives.mimcap import mimcap_array, mimcap +from glayout.routing.L_route import L_route +from glayout.routing.c_route import c_route +from glayout.primitives.via_gen import via_stack, via_array from gdsfactory.routing.route_quad import route_quad -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc +from glayout.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports +from glayout.routing.straight_route import straight_route +from glayout.util.snap_to_grid import component_snap_to_grid from pydantic import validate_arguments -from glayout.flow.placement.two_transistor_interdigitized import two_nfet_interdigitized -from glayout.flow.spice import Netlist +from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized +from glayout.spice import Netlist -from glayout.flow.blocks.composite.opamp.opamp_twostage import opamp_twostage -from glayout.flow.blocks.elementary.current_mirror import current_mirror_netlist +from glayout.blocks.composite.opamp.opamp_twostage import opamp_twostage +from glayout.blocks.elementary.current_mirror import current_mirror_netlist def opamp_output_stage_netlist(pdk: MappedPDK, output_amp_fet_ref: ComponentReference, biasParams: list) -> Netlist: bias_netlist = current_mirror_netlist(pdk, biasParams[0], biasParams[1], biasParams[2]) diff --git a/src/glayout/blocks/composite/opamp/opamp_twostage.py b/src/glayout/blocks/composite/opamp/opamp_twostage.py index 5dcbcc4b..efaee3a5 100644 --- a/src/glayout/blocks/composite/opamp/opamp_twostage.py +++ b/src/glayout/blocks/composite/opamp/opamp_twostage.py @@ -2,30 +2,30 @@ from gdsfactory.component import Component, copy from gdsfactory.component_reference import ComponentReference from gdsfactory.components.rectangle import rectangle -from glayout.flow.pdk.mappedpdk import MappedPDK +from glayout.pdk.mappedpdk import MappedPDK from typing import Optional, Union -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.blocks.elementary.diff_pair import diff_pair -from glayout.flow.primitives.guardring import tapring -from glayout.flow.primitives.mimcap import mimcap_array, mimcap -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.c_route_old import c_route -from glayout.flow.primitives.via_gen import via_stack, via_array +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.blocks.elementary.diff_pair import diff_pair +from glayout.primitives.guardring import tapring +from glayout.primitives.mimcap import mimcap_array, mimcap +from glayout.routing.L_route import L_route +from glayout.routing.c_route import c_route +from glayout.primitives.via_gen import via_stack, via_array from gdsfactory.routing.route_quad import route_quad -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc +from glayout.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports +from glayout.routing.straight_route import straight_route +from glayout.util.snap_to_grid import component_snap_to_grid from pydantic import validate_arguments -from glayout.flow.placement.two_transistor_interdigitized import two_nfet_interdigitized - -from glayout.flow.blocks.composite.diffpair_cmirror_bias import diff_pair_ibias -from glayout.flow.blocks.composite.stacked_current_mirror import stacked_nfet_current_mirror -from glayout.flow.blocks.composite.differential_to_single_ended_converter import differential_to_single_ended_converter -from glayout.flow.blocks.composite.opamp.row_csamplifier_diff_to_single_ended_converter import row_csamplifier_diff_to_single_ended_converter -from glayout.flow.blocks.composite.opamp.diff_pair_stackedcmirror import diff_pair_stackedcmirror -from glayout.flow.spice import Netlist -from glayout.flow.blocks.elementary.current_mirror import current_mirror_netlist +from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized + +from glayout.blocks.composite.diffpair_cmirror_bias import diff_pair_ibias +from glayout.blocks.composite.stacked_current_mirror import stacked_nfet_current_mirror +from glayout.blocks.composite.differential_to_single_ended_converter import differential_to_single_ended_converter +from glayout.blocks.composite.opamp.row_csamplifier_diff_to_single_ended_converter import row_csamplifier_diff_to_single_ended_converter +from glayout.blocks.composite.opamp.diff_pair_stackedcmirror import diff_pair_stackedcmirror +from glayout.spice import Netlist +from glayout.blocks.elementary.current_mirror import current_mirror_netlist @validate_arguments def __create_and_route_pins( diff --git a/src/glayout/blocks/composite/opamp/row_csamplifier_diff_to_single_ended_converter.py b/src/glayout/blocks/composite/opamp/row_csamplifier_diff_to_single_ended_converter.py index 26a4e5b0..62768c57 100644 --- a/src/glayout/blocks/composite/opamp/row_csamplifier_diff_to_single_ended_converter.py +++ b/src/glayout/blocks/composite/opamp/row_csamplifier_diff_to_single_ended_converter.py @@ -2,23 +2,23 @@ from gdsfactory.component import Component, copy from gdsfactory.component_reference import ComponentReference from gdsfactory.components.rectangle import rectangle -from glayout.flow.pdk.mappedpdk import MappedPDK +from glayout.pdk.mappedpdk import MappedPDK from typing import Optional, Union -from glayout.flow.primitives.fet import nmos, pmos, multiplier -from glayout.flow.blocks.elementary.diff_pair import diff_pair -from glayout.flow.primitives.guardring import tapring -from glayout.flow.primitives.mimcap import mimcap_array, mimcap -from glayout.flow.routing.L_route import L_route -from glayout.flow.routing.c_route_old import c_route -from glayout.flow.primitives.via_gen import via_stack, via_array +from glayout.primitives.fet import nmos, pmos, multiplier +from glayout.blocks.elementary.diff_pair import diff_pair +from glayout.primitives.guardring import tapring +from glayout.primitives.mimcap import mimcap_array, mimcap +from glayout.routing.L_route import L_route +from glayout.routing.c_route import c_route +from glayout.primitives.via_gen import via_stack, via_array from gdsfactory.routing.route_quad import route_quad -from glayout.flow.pdk.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc -from glayout.flow.pdk.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports -from glayout.flow.routing.straight_route import straight_route -from glayout.flow.pdk.util.snap_to_grid import component_snap_to_grid +from glayout.util.comp_utils import evaluate_bbox, prec_ref_center, movex, movey, to_decimal, to_float, move, align_comp_to_port, get_padding_points_cc +from glayout.util.port_utils import rename_ports_by_orientation, rename_ports_by_list, add_ports_perimeter, print_ports, set_port_orientation, rename_component_ports +from glayout.routing.straight_route import straight_route +from glayout.util.snap_to_grid import component_snap_to_grid from pydantic import validate_arguments -from glayout.flow.placement.two_transistor_interdigitized import two_nfet_interdigitized -from glayout.flow.spice import Netlist +from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized +from glayout.spice import Netlist def row_csamplifier_diff_to_single_ended_converter_netlist(diff_to_single: Component) -> Netlist: overall_netlist = Netlist( diff --git a/src/glayout/blocks/elementary/FVF/__init__.py b/src/glayout/blocks/elementary/FVF/__init__.py index fd3e01c7..2d88f2fd 100644 --- a/src/glayout/blocks/elementary/FVF/__init__.py +++ b/src/glayout/blocks/elementary/FVF/__init__.py @@ -1 +1 @@ -from glayout.blocks.elementary.FVF.fvf import flipped_voltage_follower, fvf_netlist, add_fvf_labels \ No newline at end of file +from glayout.blocks.elementary.FVF.fvf import flipped_voltage_follower, fvf_netlist, sky130_add_fvf_labels \ No newline at end of file diff --git a/src/glayout/blocks/elementary/FVF/els b/src/glayout/blocks/elementary/FVF/els new file mode 100644 index 00000000..3355bbbc --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/els @@ -0,0 +1,20 @@ +| units: 500000 tech: sky130A format: MIT +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=-663 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=248 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=-663 sky130_fd_pr__nfet_01v8 +x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=248 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=-863 sky130_fd_pr__nfet_01v8 +x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=-863 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=-863 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=248 sky130_fd_pr__nfet_01v8 +x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=248 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=248 sky130_fd_pr__nfet_01v8 +x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=-663 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=248 sky130_fd_pr__nfet_01v8 +C Ib VIN 0.7 +C Ib0 11.7 +R Ib 2390 +C VIN0 3.9 +R VIN 679 +R VOUT 67459 += VOUT VBULK diff --git a/src/glayout/blocks/elementary/FVF/evaluator_wrapper.py b/src/glayout/blocks/elementary/FVF/evaluator_wrapper.py deleted file mode 100644 index 893a6bfc..00000000 --- a/src/glayout/blocks/elementary/FVF/evaluator_wrapper.py +++ /dev/null @@ -1,76 +0,0 @@ -# comprehensive evaluator -import os -import json -import logging -from datetime import datetime -from pathlib import Path -from gdsfactory.typings import Component - -from glayout.blocks.evaluator_box.verification import run_verification -from glayout.blocks.evaluator_box.physical_features import run_physical_feature_extraction - -def get_next_filename(base_name="evaluation", extension=".json"): - """ - Generates the next available filename with a numerical suffix, starting from 1. - e.g., base_name_1.json, base_name_2.json, etc. - """ - i = 1 - while True: - filename = f"{base_name}_{i}{extension}" - if not os.path.exists(filename): - return filename - i += 1 - -def run_evaluation(layout_path: str, component_name: str, top_level: Component) -> dict: - """ - The main evaluation wrapper. Runs all evaluation modules and combines results. - """ - print(f"--- Starting Comprehensive Evaluation for {component_name} ---") - - # Deletes known intermediate and report files for a given component to ensure a clean run. - print(f"Cleaning up intermediate files for component '{component_name}'...") - - files_to_delete = [ - f"{component_name}.res.ext", - f"{component_name}.lvs.rpt", - f"{component_name}_lvs.rpt", - f"{component_name}.nodes", - f"{component_name}.sim", - f"{component_name}.pex.spice", - f"{component_name}_pex.spice" - ] - - for f_path in files_to_delete: - try: - if os.path.exists(f_path): - os.remove(f_path) - print(f" - Deleted: {f_path}") - except OSError as e: - print(f" - Warning: Could not delete {f_path}. Error: {e}") - - # Run verification module - print("Running verification checks (DRC, LVS)...") - verification_results = run_verification(layout_path, component_name, top_level) - - # Run physical features module - print("Running physical feature extraction (PEX, Area, Symmetry)...") - physical_results = run_physical_feature_extraction(layout_path, component_name, top_level) - - # Combine results into a single dictionary - final_results = { - "component_name": component_name, - "timestamp": datetime.now().isoformat(), - "drc_lvs_fail": not (verification_results["drc"]["is_pass"] and verification_results["lvs"]["is_pass"]), - **verification_results, - **physical_results - } - - # Generate the output JSON filename - output_filename = get_next_filename(base_name=component_name, extension=".json") - - # Write the results dictionary to a JSON file - with open(output_filename, 'w') as json_file: - json.dump(final_results, json_file, indent=4) - print(f"--- Evaluation complete. Results saved to {output_filename} ---") - - return final_results diff --git a/src/glayout/blocks/elementary/FVF/fvf.cdl b/src/glayout/blocks/elementary/FVF/fvf.cdl deleted file mode 100644 index a60e694b..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf.cdl +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/glayout/blocks/elementary/FVF/fvf.ext b/src/glayout/blocks/elementary/FVF/fvf.ext new file mode 100644 index 00000000..ababadf5 --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf.ext @@ -0,0 +1,28 @@ +timestamp 1400616048 +version 8.3 +tech sky130A +style ngspice() +scale 1000 1 500000 +resistclasses 4400000 2200000 950000 3050000 120000 197000 114000 191000 120000 197000 114000 191000 48200 319800 2000000 48200 48200 12800 125 125 47 47 29 5 +parameters sky130_fd_pr__nfet_01v8 l=l w=w a1=as p1=ps a2=ad p2=pd +port "Ib" 5 -1681 -175 -1581 -75 m2 +port "VIN" 3 100 -1098 200 -998 m1 +port "VOUT" 4 549 -377 649 -277 m2 +port "VBULK" 2 2508 970 2608 1070 m1 +node "Ib" 2390 11661.2 -1681 -175 m2 0 0 0 0 0 0 0 0 62400 1912 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 351448 3360 0 0 126852 4900 963214 20996 412124 9080 0 0 0 0 0 0 0 0 +node "VIN" 679 3876.86 100 -1098 m1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612408 4480 0 0 34848 2112 97000 3140 82508 2608 0 0 0 0 0 0 0 0 +substrate "VOUT" 0 0 549 -377 m2 0 0 0 0 0 0 0 0 499200 16232 1518640 37040 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1455648 14400 0 0 2352952 67214 1921678 40186 649934 9348 0 0 0 0 0 0 0 0 +equiv "VOUT" "VBULK" +cap "Ib" "VIN" 696.867 +device msubckt sky130_fd_pr__nfet_01v8 3039 -664 3040 -663 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 2361 -664 2362 -663 l=394 w=200 "VOUT" "Ib" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 1683 -664 1684 -663 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 3039 248 3040 249 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 2361 248 2362 249 l=394 w=200 "VOUT" "Ib" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 1683 248 1684 249 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 521 -864 522 -863 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -237 -864 -236 -863 l=474 w=400 "VOUT" "VIN" 948 0 "VOUT" 400 31200,956 "Ib" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -995 -864 -994 -863 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 521 248 522 249 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -237 248 -236 249 l=474 w=400 "VOUT" "VIN" 948 0 "VOUT" 400 31200,956 "Ib" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -995 248 -994 249 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 diff --git a/src/glayout/blocks/elementary/FVF/fvf.nodes b/src/glayout/blocks/elementary/FVF/fvf.nodes new file mode 100644 index 00000000..eca54a57 --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf.nodes @@ -0,0 +1,3 @@ +Ib -1680 -174 m2 +VIN 100 -1097 m1 +VOUT 549 -376 m2 diff --git a/src/glayout/blocks/elementary/FVF/fvf.py b/src/glayout/blocks/elementary/FVF/fvf.py index 9afff8b7..b244cb04 100644 --- a/src/glayout/blocks/elementary/FVF/fvf.py +++ b/src/glayout/blocks/elementary/FVF/fvf.py @@ -1,6 +1,5 @@ -from glayout import MappedPDK, sky130,gf180 -from glayout.spice.netlist import Netlist -from glayout.routing import c_route,L_route,straight_route +from glayout.pdk.mappedpdk import MappedPDK +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.cell import cell from gdsfactory.component import Component from gdsfactory import Component @@ -8,18 +7,50 @@ from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port from glayout.util.snap_to_grid import component_snap_to_grid from glayout.util.port_utils import rename_ports_by_orientation +from glayout.routing.straight_route import straight_route +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route from glayout.primitives.guardring import tapring from glayout.util.port_utils import add_ports_perimeter +from glayout.spice.netlist import Netlist from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle -from glayout.blocks.elementary.FVF.evaluator_wrapper import run_evaluation # This is broken, need to be fixed +try: + from glayout.blocks.evaluator_box.evaluator_wrapper import run_evaluation +except ImportError: + print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") + run_evaluation = None + +def get_component_netlist(component): + """Helper function to get netlist object from component info, compatible with all gdsfactory versions""" + from glayout.spice.netlist import Netlist + + # Try to get stored object first (for older gdsfactory versions) + if 'netlist_obj' in component.info: + return component.info['netlist_obj'] + + # Try to reconstruct from netlist_data (for newer gdsfactory versions) + if 'netlist_data' in component.info: + data = component.info['netlist_data'] + netlist = Netlist( + circuit_name=data['circuit_name'], + nodes=data['nodes'] + ) + netlist.source_netlist = data['source_netlist'] + return netlist + + # Fallback: return the string representation (should not happen in normal operation) + return component.info.get('netlist', '') def fvf_netlist(fet_1: Component, fet_2: Component) -> Netlist: netlist = Netlist(circuit_name='FLIPPED_VOLTAGE_FOLLOWER', nodes=['VIN', 'VBULK', 'VOUT', 'Ib']) - netlist.connect_netlist(fet_1.info['netlist'], [('D', 'Ib'), ('G', 'VIN'), ('S', 'VOUT'), ('B', 'VBULK')]) - netlist.connect_netlist(fet_2.info['netlist'], [('D', 'VOUT'), ('G', 'Ib'), ('S', 'VBULK'), ('B', 'VBULK')]) + # Use helper function to get netlist objects regardless of gdsfactory version + fet_1_netlist = get_component_netlist(fet_1) + fet_2_netlist = get_component_netlist(fet_2) + netlist.connect_netlist(fet_1_netlist, [('D', 'Ib'), ('G', 'VIN'), ('S', 'VOUT'), ('B', 'VBULK')]) + netlist.connect_netlist(fet_2_netlist, [('D', 'VOUT'), ('G', 'Ib'), ('S', 'VBULK'), ('B', 'VBULK')]) return netlist @@ -63,13 +94,13 @@ def sky130_add_fvf_labels(fvf_in: Component) -> Component: @cell def flipped_voltage_follower( - pdk: MappedPDK, - device_type: str = "nmos", - placement: str = "horizontal", - width: tuple[float,float] = (3,3), - length: tuple[float,float] = (None,None), - fingers: tuple[int,int] = (1,1), - multipliers: tuple[int,int] = (1,1), + pdk: MappedPDK, + device_type: str = "nmos", + placement: str = "horizontal", + width: tuple[float,float] = (6.605703928526579, 3.713220935212418), + length: tuple[float,float] = (2.3659471990041707, 1.9639325665440608), + fingers: tuple[int,int] = (1, 1), + multipliers: tuple[int,int] = (2, 2), dummy_1: tuple[bool,bool] = (True,True), dummy_2: tuple[bool,bool] = (True,True), tie_layers1: tuple[str,str] = ("met2","met1"), @@ -111,7 +142,6 @@ def flipped_voltage_follower( fet_1 = device(pdk, width=width[0], fingers=fingers[0], multipliers=multipliers[0], with_dummy=dummy_1, with_substrate_tap=False, length=length[0], tie_layers=tie_layers1, sd_rmult=sd_rmult, **kwargs) fet_2 = device(pdk, width=width[1], fingers=fingers[1], multipliers=multipliers[1], with_dummy=dummy_2, with_substrate_tap=False, length=length[1], tie_layers=tie_layers2, sd_rmult=sd_rmult, **kwargs) well = "pwell" if device == nmos else "nwell" - fet_1_ref = top_level << fet_1 fet_2_ref = top_level << fet_2 @@ -157,66 +187,25 @@ def flipped_voltage_follower( component = component_snap_to_grid(rename_ports_by_orientation(top_level)) #component = rename_ports_by_orientation(top_level) - component.info['netlist'] = fvf_netlist(fet_1, fet_2) + # Store netlist as string for LVS (avoids gymnasium info dict type restrictions) + # Compatible with both gdsfactory 7.7.0 and 7.16.0+ strict Pydantic validation + netlist_obj = fvf_netlist(fet_1, fet_2) + component.info['netlist'] = netlist_obj.generate_netlist() + # Store the Netlist object for hierarchical netlist building (used by lvcm.py etc.) + component.info['netlist_obj'] = netlist_obj + # Store serialized netlist data for reconstruction if needed + component.info['netlist_data'] = { + 'circuit_name': netlist_obj.circuit_name, + 'nodes': netlist_obj.nodes, + 'source_netlist': netlist_obj.source_netlist + } return component -if __name__ == "__main__": - # OLD EVAL CODE - # comp = flipped_voltage_follower(sky130) - # # comp.pprint_ports() - # comp = add_fvf_labels(comp,sky130) - # comp.name = "FVF" - # comp.show() - # #print(comp.info['netlist'].generate_netlist()) - # print("...Running DRC...") - # drc_result = sky130.drc_magic(comp, "FVF") - # ## Klayout DRC - # #drc_result = sky130.drc(comp)\n - - # time.sleep(5) - - # print("...Running LVS...") - # lvs_res=sky130.lvs_netgen(comp, "FVF") - # #print("...Saving GDS...") - # #comp.write_gds('out_FVF.gds') - - # NEW EVAL CODE - fvf = sky130_add_fvf_labels(flipped_voltage_follower(sky130, width=(2,1), sd_rmult=3)) +if __name__=="__main__": + fvf = sky130_add_fvf_labels(flipped_voltage_follower(sky130_mapped_pdk, width=(2,1), sd_rmult=3)) fvf.show() fvf.name = "fvf" fvf_gds = fvf.write_gds("fvf.gds") - - # Debug: Check if netlist exists and print it - if 'netlist' in fvf.info: - print("Netlist found in component info:") - - # Try to get stored object first (for older gdsfactory versions) - if 'netlist_obj' in fvf.info: - netlist_obj = fvf.info['netlist_obj'] - netlist_content = netlist_obj.generate_netlist() - # Try to reconstruct from netlist_data (for newer gdsfactory versions) - elif 'netlist_data' in fvf.info: - data = fvf.info['netlist_data'] - netlist_obj = Netlist( - circuit_name=data['circuit_name'], - nodes=data['nodes'] - ) - netlist_obj.source_netlist = data['source_netlist'] - netlist_content = netlist_obj.generate_netlist() - else: - # Fallback: if it's already a string, use it directly - netlist_content = str(fvf.info['netlist']) - - print(netlist_content) - print("Writing netlist to fvf.cdl for inspection...") - with open("fvf.cdl", "w") as f: - f.write(netlist_content) - else: - print("No netlist found in component info!") - result = run_evaluation("fvf.gds",fvf.name,fvf) - print(result) - - - + print(result) \ No newline at end of file diff --git a/src/glayout/blocks/elementary/FVF/fvf.res.ext b/src/glayout/blocks/elementary/FVF/fvf.res.ext new file mode 100644 index 00000000..01036b3c --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf.res.ext @@ -0,0 +1,1873 @@ +scale 1000 1 500000 +rnode "VIN.t1" 0 0 0 448 0 +rnode "VIN.t0" 0 0 0 -664 0 +rnode "VIN.n0" 0 0 0 -864 0 +rnode "VIN" 0 0 100 -1098 0 +resist "VIN" "VIN.n0" 0.0144903 +resist "VIN.n0" "VIN.t0" 69.7708 +resist "VIN.n0" "VIN.t1" 81.827 +rnode "Ib.t2" 0 0 2558 348 0 +rnode "Ib.t3" 0 0 2558 -564 0 +rnode "Ib.n0" 0 0 2918 -858 0 +rnode "Ib.n1" 0 0 270 -562 0 +rnode "Ib.n2" 0 0 270 -664 0 +rnode "Ib.t0" 0 0 237 -664 0 +rnode "Ib.n3" 0 0 270 -630 0 +rnode "Ib.n4" 0 0 270 -630 0 +rnode "Ib.n5" 0 0 270 -592 0 +rnode "Ib.n6" 0 0 270 -592 0 +rnode "Ib.n7" 0 0 270 -520 0 +rnode "Ib.n8" 0 0 270 550 0 +rnode "Ib.n9" 0 0 270 448 0 +rnode "Ib.t1" 0 0 237 448 0 +rnode "Ib.n10" 0 0 270 482 0 +rnode "Ib.n11" 0 0 270 482 0 +rnode "Ib.n12" 0 0 270 520 0 +rnode "Ib.n13" 0 0 270 520 0 +rnode "Ib.n14" 0 0 270 592 0 +rnode "Ib.n15" 0 0 -702 -162 0 +rnode "Ib" 0 0 -1681 -175 0 +resist "Ib.n13" "Ib.n9" 3.44721 +resist "Ib.n6" "Ib.n2" 3.44721 +resist "Ib" "Ib.n15" 5.27024 +resist "Ib.n12" "Ib.n8" 5.81818 +resist "Ib.n5" "Ib.n1" 5.81818 +resist "Ib.n12" "Ib.n11" 7.3697 +resist "Ib.n5" "Ib.n4" 7.3697 +resist "Ib.n14" "Ib.n8" 8.14545 +resist "Ib.n7" "Ib.n1" 8.14545 +resist "Ib.n13" "Ib.n12" 9.3 +resist "Ib.n6" "Ib.n5" 9.3 +resist "Ib.n14" "Ib.n13" 9.45517 +resist "Ib.n7" "Ib.n6" 9.45517 +resist "Ib.n11" "Ib.n9" 9.71124 +resist "Ib.n4" "Ib.n2" 9.71124 +resist "Ib" "Ib.n0" 20.9418 +resist "Ib.n10" "Ib.t1" 52.3077 +resist "Ib.n3" "Ib.t0" 52.3077 +resist "Ib.n0" "Ib.t3" 73.2946 +resist "Ib.n0" "Ib.t2" 77.952 +resist "Ib.n15" "Ib.n7" 87.9619 +resist "Ib.n15" "Ib.n14" 97.7608 +resist "Ib.t1" "Ib.n9" 167.116 +resist "Ib.t0" "Ib.n2" 167.116 +resist "Ib.n11" "Ib.n10" 185 +resist "Ib.n4" "Ib.n3" 185 +resist "Ib.n10" "Ib.n8" 289.615 +resist "Ib.n3" "Ib.n1" 289.615 +rnode "VOUT.n0" 0 0 2608 1029 0 +rnode "VOUT.n1" 0 0 2508 1029 0 +rnode "VOUT.n2" 0 0 2308 1029 0 +rnode "VOUT.n3" 0 0 2408 1029 0 +rnode "VOUT.n4" 0 0 2308 1029 0 +rnode "VOUT.n5" 0 0 2208 1029 0 +rnode "VOUT.n6" 0 0 2108 1029 0 +rnode "VOUT.n7" 0 0 1908 1029 0 +rnode "VOUT.n8" 0 0 2008 1029 0 +rnode "VOUT.n9" 0 0 1908 1029 0 +rnode "VOUT.n10" 0 0 1808 1029 0 +rnode "VOUT.n11" 0 0 1708 1029 0 +rnode "VOUT.n12" 0 0 1432 918 0 +rnode "VOUT.n13" 0 0 1708 1029 0 +rnode "VOUT.n14" 0 0 1432 918 0 +rnode "VOUT.n15" 0 0 1708 1029 0 +rnode "VOUT.n16" 0 0 1608 -1029 0 +rnode "VOUT.n17" 0 0 1432 850 0 +rnode "VOUT.n18" 0 0 1432 714 0 +rnode "VOUT.n19" 0 0 1432 578 0 +rnode "VOUT.n20" 0 0 1432 442 0 +rnode "VOUT.n21" 0 0 1432 306 0 +rnode "VOUT.n22" 0 0 1432 170 0 +rnode "VOUT.n23" 0 0 1432 34 0 +rnode "VOUT.n24" 0 0 1432 -102 0 +rnode "VOUT.n25" 0 0 1432 -238 0 +rnode "VOUT.n26" 0 0 1432 -374 0 +rnode "VOUT.n27" 0 0 1432 -510 0 +rnode "VOUT.n28" 0 0 1432 -646 0 +rnode "VOUT.n29" 0 0 1432 -782 0 +rnode "VOUT.n30" 0 0 1432 -850 0 +rnode "VOUT.t33" 0 0 1683 -564 0 +rnode "VOUT.t32" 0 0 2077 -564 0 +rnode "VOUT.t31" 0 0 1880 -664 0 +rnode "VOUT.n31" 0 0 1880 -747 0 +rnode "VOUT.n32" 0 0 1650 -714 0 +rnode "VOUT.t13" 0 0 1683 348 0 +rnode "VOUT.t12" 0 0 2077 348 0 +rnode "VOUT.t10" 0 0 1880 248 0 +rnode "VOUT.n33" 0 0 1880 165 0 +rnode "VOUT.n34" 0 0 1650 198 0 +rnode "VOUT.n35" 0 0 1473 165 0 +rnode "VOUT.n36" 0 0 1432 850 0 +rnode "VOUT.n37" 0 0 1432 850 0 +rnode "VOUT.n38" 0 0 1432 782 0 +rnode "VOUT.n39" 0 0 1432 782 0 +rnode "VOUT.n40" 0 0 1432 714 0 +rnode "VOUT.n41" 0 0 1432 714 0 +rnode "VOUT.n42" 0 0 1432 646 0 +rnode "VOUT.n43" 0 0 1432 646 0 +rnode "VOUT.n44" 0 0 1432 578 0 +rnode "VOUT.n45" 0 0 1432 578 0 +rnode "VOUT.n46" 0 0 1432 510 0 +rnode "VOUT.n47" 0 0 1432 510 0 +rnode "VOUT.n48" 0 0 1432 442 0 +rnode "VOUT.n49" 0 0 1432 442 0 +rnode "VOUT.n50" 0 0 1432 374 0 +rnode "VOUT.n51" 0 0 1432 374 0 +rnode "VOUT.n52" 0 0 1432 306 0 +rnode "VOUT.n53" 0 0 1432 306 0 +rnode "VOUT.n54" 0 0 1432 238 0 +rnode "VOUT.n55" 0 0 1432 238 0 +rnode "VOUT.n56" 0 0 1432 170 0 +rnode "VOUT.n57" 0 0 1432 170 0 +rnode "VOUT.n58" 0 0 1432 102 0 +rnode "VOUT.n59" 0 0 1432 102 0 +rnode "VOUT.n60" 0 0 1432 34 0 +rnode "VOUT.n61" 0 0 1432 34 0 +rnode "VOUT.n62" 0 0 1432 -34 0 +rnode "VOUT.n63" 0 0 1432 -34 0 +rnode "VOUT.n64" 0 0 1432 -102 0 +rnode "VOUT.n65" 0 0 1432 -102 0 +rnode "VOUT.n66" 0 0 1432 -170 0 +rnode "VOUT.n67" 0 0 1432 -170 0 +rnode "VOUT.n68" 0 0 1432 -238 0 +rnode "VOUT.n69" 0 0 1432 -238 0 +rnode "VOUT.n70" 0 0 1432 -306 0 +rnode "VOUT.n71" 0 0 1432 -306 0 +rnode "VOUT.t35" 0 0 2361 -564 0 +rnode "VOUT.t2" 0 0 2361 348 0 +rnode "VOUT.t1" 0 0 2755 348 0 +rnode "VOUT.t34" 0 0 2755 -564 0 +rnode "VOUT" 0 0 549 -377 0 +rnode "VOUT.n72" 0 0 -270 550 0 +rnode "VOUT.n73" 0 0 -270 448 0 +rnode "VOUT.t5" 0 0 -237 448 0 +rnode "VOUT.n74" 0 0 -270 482 0 +rnode "VOUT.n75" 0 0 -270 482 0 +rnode "VOUT.n76" 0 0 -270 520 0 +rnode "VOUT.n77" 0 0 -270 520 0 +rnode "VOUT.n78" 0 0 -270 592 0 +rnode "VOUT.n79" 0 0 -270 -562 0 +rnode "VOUT.n80" 0 0 -270 -664 0 +rnode "VOUT.t4" 0 0 -237 -664 0 +rnode "VOUT.n81" 0 0 -270 -630 0 +rnode "VOUT.n82" 0 0 -270 -630 0 +rnode "VOUT.n83" 0 0 -270 -592 0 +rnode "VOUT.n84" 0 0 -270 -592 0 +rnode "VOUT.n85" 0 0 -270 -520 0 +rnode "VOUT.n86" 0 0 -270 -320 0 +rnode "VOUT.n87" 0 0 599 -320 0 +rnode "VOUT.n88" 0 0 2009 438 0 +rnode "VOUT.n89" 0 0 2049 438 0 +rnode "VOUT.n90" 0 0 2297 -380 0 +rnode "VOUT.n91" 0 0 1473 -320 0 +rnode "VOUT.n92" 0 0 1432 -374 0 +rnode "VOUT.n93" 0 0 1432 -374 0 +rnode "VOUT.n94" 0 0 1432 -442 0 +rnode "VOUT.n95" 0 0 1432 -442 0 +rnode "VOUT.n96" 0 0 1432 -510 0 +rnode "VOUT.n97" 0 0 1432 -510 0 +rnode "VOUT.n98" 0 0 1432 -578 0 +rnode "VOUT.n99" 0 0 1432 -578 0 +rnode "VOUT.n100" 0 0 1432 -646 0 +rnode "VOUT.n101" 0 0 1432 -646 0 +rnode "VOUT.n102" 0 0 1432 -714 0 +rnode "VOUT.n103" 0 0 1432 -714 0 +rnode "VOUT.n104" 0 0 1473 -747 0 +rnode "VOUT.n105" 0 0 1432 -782 0 +rnode "VOUT.n106" 0 0 1432 -782 0 +rnode "VOUT.n107" 0 0 1432 -850 0 +rnode "VOUT.n108" 0 0 1708 -1029 0 +rnode "VOUT.n109" 0 0 1808 -1029 0 +rnode "VOUT.n110" 0 0 1908 -1029 0 +rnode "VOUT.n111" 0 0 2108 1029 0 +rnode "VOUT.n112" 0 0 2108 1029 0 +rnode "VOUT.n113" 0 0 2108 -1029 0 +rnode "VOUT.n114" 0 0 2108 -1029 0 +rnode "VOUT.n115" 0 0 1908 -1029 0 +rnode "VOUT.n116" 0 0 2308 -1029 0 +rnode "VOUT.n117" 0 0 2308 -1029 0 +rnode "VOUT.n118" 0 0 2308 -1029 0 +rnode "VOUT.n119" 0 0 2508 1029 0 +rnode "VOUT.n120" 0 0 2508 -1029 0 +rnode "VOUT.n121" 0 0 2508 -1029 0 +rnode "VOUT.n122" 0 0 2708 -1029 0 +rnode "VOUT.n123" 0 0 2708 -1029 0 +rnode "VOUT.n124" 0 0 2708 -1029 0 +rnode "VOUT.n125" 0 0 2708 1029 0 +rnode "VOUT.t0" 0 0 2558 348 0 +rnode "VOUT.n126" 0 0 2708 1029 0 +rnode "VOUT.n127" 0 0 2508 1029 0 +rnode "VOUT.n128" 0 0 2808 1029 0 +rnode "VOUT.n129" 0 0 3008 1029 0 +rnode "VOUT.n130" 0 0 3008 1029 0 +rnode "VOUT.n131" 0 0 3008 1029 0 +rnode "VOUT.n132" 0 0 2808 1029 0 +rnode "VOUT.n133" 0 0 3008 1029 0 +rnode "VOUT.n134" 0 0 2908 -1029 0 +rnode "VOUT.n135" 0 0 2908 -1029 0 +rnode "VOUT.n136" 0 0 3108 -1029 0 +rnode "VOUT.n137" 0 0 3108 -1029 0 +rnode "VOUT.n138" 0 0 3208 -1029 0 +rnode "VOUT.n139" 0 0 3208 1029 0 +rnode "VOUT.n140" 0 0 3208 1029 0 +rnode "VOUT.n141" 0 0 3208 1029 0 +rnode "VOUT.n142" 0 0 3408 1029 0 +rnode "VOUT.n143" 0 0 3408 1029 0 +rnode "VOUT.n144" 0 0 3408 1029 0 +rnode "VOUT.n145" 0 0 3408 1029 0 +rnode "VOUT.n146" 0 0 3408 -1029 0 +rnode "VOUT.n147" 0 0 3408 -1029 0 +rnode "VOUT.n148" 0 0 3208 -1029 0 +rnode "VOUT.n149" 0 0 3684 -918 0 +rnode "VOUT.n150" 0 0 3684 -918 0 +rnode "VOUT.n151" 0 0 3684 918 0 +rnode "VOUT.n152" 0 0 3684 918 0 +rnode "VOUT.n153" 0 0 3684 782 0 +rnode "VOUT.n154" 0 0 3684 918 0 +rnode "VOUT.n155" 0 0 3684 578 0 +rnode "VOUT.n156" 0 0 3684 442 0 +rnode "VOUT.n157" 0 0 3684 306 0 +rnode "VOUT.n158" 0 0 3684 170 0 +rnode "VOUT.t29" 0 0 3433 348 0 +rnode "VOUT.t30" 0 0 3039 348 0 +rnode "VOUT.t28" 0 0 3236 248 0 +rnode "VOUT.n159" 0 0 3236 165 0 +rnode "VOUT.n160" 0 0 3466 198 0 +rnode "VOUT.n161" 0 0 3684 34 0 +rnode "VOUT.n162" 0 0 3684 -102 0 +rnode "VOUT.n163" 0 0 3684 -238 0 +rnode "VOUT.n164" 0 0 3684 -374 0 +rnode "VOUT.n165" 0 0 3684 -510 0 +rnode "VOUT.n166" 0 0 3684 -646 0 +rnode "VOUT.t26" 0 0 3433 -564 0 +rnode "VOUT.t27" 0 0 3039 -564 0 +rnode "VOUT.t24" 0 0 3236 -664 0 +rnode "VOUT.n167" 0 0 3236 -747 0 +rnode "VOUT.n168" 0 0 3466 -714 0 +rnode "VOUT.n169" 0 0 3643 -747 0 +rnode "VOUT.n170" 0 0 3684 918 0 +rnode "VOUT.n171" 0 0 3684 -850 0 +rnode "VOUT.n172" 0 0 3684 -850 0 +rnode "VOUT.n173" 0 0 3684 -782 0 +rnode "VOUT.n174" 0 0 3684 -782 0 +rnode "VOUT.n175" 0 0 3684 918 0 +rnode "VOUT.n176" 0 0 3684 -714 0 +rnode "VOUT.n177" 0 0 3684 -714 0 +rnode "VOUT.n178" 0 0 3684 -646 0 +rnode "VOUT.n179" 0 0 3684 -578 0 +rnode "VOUT.n180" 0 0 3684 -578 0 +rnode "VOUT.n181" 0 0 3684 918 0 +rnode "VOUT.n182" 0 0 3684 -510 0 +rnode "VOUT.n183" 0 0 3684 918 0 +rnode "VOUT.n184" 0 0 3684 -442 0 +rnode "VOUT.n185" 0 0 3684 -442 0 +rnode "VOUT.n186" 0 0 3684 -374 0 +rnode "VOUT.n187" 0 0 3684 -306 0 +rnode "VOUT.n188" 0 0 3684 -306 0 +rnode "VOUT.n189" 0 0 3684 918 0 +rnode "VOUT.n190" 0 0 3684 -238 0 +rnode "VOUT.n191" 0 0 3684 918 0 +rnode "VOUT.n192" 0 0 3684 -170 0 +rnode "VOUT.n193" 0 0 3684 -170 0 +rnode "VOUT.n194" 0 0 3684 -102 0 +rnode "VOUT.n195" 0 0 3684 -34 0 +rnode "VOUT.n196" 0 0 3684 -34 0 +rnode "VOUT.n197" 0 0 3684 918 0 +rnode "VOUT.n198" 0 0 3684 34 0 +rnode "VOUT.n199" 0 0 3684 918 0 +rnode "VOUT.n200" 0 0 3684 102 0 +rnode "VOUT.n201" 0 0 3684 102 0 +rnode "VOUT.n202" 0 0 3643 165 0 +rnode "VOUT.n203" 0 0 3684 170 0 +rnode "VOUT.n204" 0 0 3684 238 0 +rnode "VOUT.n205" 0 0 3684 238 0 +rnode "VOUT.n206" 0 0 3684 918 0 +rnode "VOUT.n207" 0 0 3684 306 0 +rnode "VOUT.n208" 0 0 3684 918 0 +rnode "VOUT.n209" 0 0 3684 374 0 +rnode "VOUT.n210" 0 0 3684 374 0 +rnode "VOUT.n211" 0 0 3684 442 0 +rnode "VOUT.n212" 0 0 3684 510 0 +rnode "VOUT.n213" 0 0 3684 510 0 +rnode "VOUT.n214" 0 0 3684 918 0 +rnode "VOUT.n215" 0 0 3684 578 0 +rnode "VOUT.n216" 0 0 3684 646 0 +rnode "VOUT.n217" 0 0 3684 646 0 +rnode "VOUT.n218" 0 0 3684 714 0 +rnode "VOUT.n219" 0 0 3684 714 0 +rnode "VOUT.n220" 0 0 3684 782 0 +rnode "VOUT.n221" 0 0 3684 918 0 +rnode "VOUT.n222" 0 0 3684 850 0 +rnode "VOUT.n223" 0 0 3684 850 0 +rnode "VOUT.n224" 0 0 3684 918 0 +rnode "VOUT.n225" 0 0 3508 1029 0 +rnode "VOUT.n226" 0 0 3508 1029 0 +rnode "VOUT.n227" 0 0 3508 1029 0 +rnode "VOUT.n228" 0 0 3508 1029 0 +rnode "VOUT.n229" 0 0 3508 -1029 0 +rnode "VOUT.n230" 0 0 3508 -1029 0 +rnode "VOUT.n231" 0 0 3508 -1029 0 +rnode "VOUT.n232" 0 0 3408 -1029 0 +rnode "VOUT.n233" 0 0 3208 -1029 0 +rnode "VOUT.n234" 0 0 3308 -1029 0 +rnode "VOUT.n235" 0 0 3308 -1029 0 +rnode "VOUT.n236" 0 0 3308 -1029 0 +rnode "VOUT.t25" 0 0 3236 348 0 +rnode "VOUT.n237" 0 0 3308 1029 0 +rnode "VOUT.n238" 0 0 3308 1029 0 +rnode "VOUT.n239" 0 0 3308 1029 0 +rnode "VOUT.n240" 0 0 3308 1029 0 +rnode "VOUT.n241" 0 0 3208 1029 0 +rnode "VOUT.n242" 0 0 3108 1029 0 +rnode "VOUT.n243" 0 0 3108 1029 0 +rnode "VOUT.n244" 0 0 3108 1029 0 +rnode "VOUT.n245" 0 0 3108 1029 0 +rnode "VOUT.n246" 0 0 3108 -1029 0 +rnode "VOUT.n247" 0 0 3008 -1029 0 +rnode "VOUT.n248" 0 0 3008 -1029 0 +rnode "VOUT.n249" 0 0 3008 -1029 0 +rnode "VOUT.n250" 0 0 2908 -1029 0 +rnode "VOUT.n251" 0 0 2808 -1029 0 +rnode "VOUT.n252" 0 0 2808 -1029 0 +rnode "VOUT.n253" 0 0 2808 -1029 0 +rnode "VOUT.n254" 0 0 2808 1029 0 +rnode "VOUT.n255" 0 0 2908 1029 0 +rnode "VOUT.n256" 0 0 2908 1029 0 +rnode "VOUT.n257" 0 0 2908 1029 0 +rnode "VOUT.n258" 0 0 2908 1029 0 +rnode "VOUT.n259" 0 0 2808 1029 0 +rnode "VOUT.n260" 0 0 2708 1029 0 +rnode "VOUT.n261" 0 0 2708 1029 0 +rnode "VOUT.n262" 0 0 2608 1029 0 +rnode "VOUT.n263" 0 0 2608 1029 0 +rnode "VOUT.n264" 0 0 2608 1029 0 +rnode "VOUT.n265" 0 0 2608 -1029 0 +rnode "VOUT.n266" 0 0 2608 -1029 0 +rnode "VOUT.n267" 0 0 2608 -1029 0 +rnode "VOUT.n268" 0 0 2508 -1029 0 +rnode "VOUT.n269" 0 0 2408 -1029 0 +rnode "VOUT.n270" 0 0 2408 -1029 0 +rnode "VOUT.n271" 0 0 2408 -1029 0 +rnode "VOUT.n272" 0 0 2408 1029 0 +rnode "VOUT.n273" 0 0 2308 1029 0 +rnode "VOUT.n274" 0 0 2208 1029 0 +rnode "VOUT.n275" 0 0 2208 -1029 0 +rnode "VOUT.n276" 0 0 2208 -1029 0 +rnode "VOUT.n277" 0 0 2208 -1029 0 +rnode "VOUT.n278" 0 0 2108 -1029 0 +rnode "VOUT.n279" 0 0 1808 -1029 0 +rnode "VOUT.n280" 0 0 1908 -1029 0 +rnode "VOUT.n281" 0 0 2008 -1029 0 +rnode "VOUT.n282" 0 0 2008 -1029 0 +rnode "VOUT.n283" 0 0 2008 -1029 0 +rnode "VOUT.n284" 0 0 2008 1029 0 +rnode "VOUT.n285" 0 0 1908 1029 0 +rnode "VOUT.t11" 0 0 1880 348 0 +rnode "VOUT.n286" 0 0 1808 1029 0 +rnode "VOUT.n287" 0 0 1808 -1029 0 +rnode "VOUT.n288" 0 0 1708 -1029 0 +rnode "VOUT.n289" 0 0 1708 -1029 0 +rnode "VOUT.n290" 0 0 1608 -1029 0 +rnode "VOUT.n291" 0 0 1608 -1029 0 +rnode "VOUT.n292" 0 0 1432 -918 0 +rnode "VOUT.n293" 0 0 1432 -918 0 +rnode "VOUT.n294" 0 0 1432 -918 0 +rnode "VOUT.n295" 0 0 1246 1088 0 +rnode "VOUT.n296" 0 0 1246 1088 0 +rnode "VOUT.n297" 0 0 1246 1088 0 +rnode "VOUT.n298" 0 0 1246 1088 0 +rnode "VOUT.n299" 0 0 1246 1088 0 +rnode "VOUT.n300" 0 0 1246 1088 0 +rnode "VOUT.n301" 0 0 1246 1088 0 +rnode "VOUT.n302" 0 0 1246 1088 0 +rnode "VOUT.n303" 0 0 1246 1088 0 +rnode "VOUT.n304" 0 0 1246 1088 0 +rnode "VOUT.n305" 0 0 1246 1088 0 +rnode "VOUT.n306" 0 0 1246 1088 0 +rnode "VOUT.n307" 0 0 1246 1088 0 +rnode "VOUT.n308" 0 0 1246 1088 0 +rnode "VOUT.n309" 0 0 1246 1088 0 +rnode "VOUT.n310" 0 0 1050 1229 0 +rnode "VOUT.n311" 0 0 1246 952 0 +rnode "VOUT.n312" 0 0 1246 1020 0 +rnode "VOUT.n313" 0 0 1050 1229 0 +rnode "VOUT.n314" 0 0 1050 1229 0 +rnode "VOUT.t8" 0 0 995 448 0 +rnode "VOUT.t9" 0 0 521 448 0 +rnode "VOUT.t6" 0 0 758 448 0 +rnode "VOUT.n315" 0 0 758 165 0 +rnode "VOUT.n316" 0 0 1028 198 0 +rnode "VOUT.t22" 0 0 995 -664 0 +rnode "VOUT.t23" 0 0 521 -664 0 +rnode "VOUT.t21" 0 0 758 -664 0 +rnode "VOUT.n317" 0 0 758 -947 0 +rnode "VOUT.n318" 0 0 1028 -914 0 +rnode "VOUT.n319" 0 0 1050 -1229 0 +rnode "VOUT.n320" 0 0 950 -1229 0 +rnode "VOUT.n321" 0 0 850 -1229 0 +rnode "VOUT.n322" 0 0 650 -1229 0 +rnode "VOUT.n323" 0 0 650 -1229 0 +rnode "VOUT.n324" 0 0 850 -1229 0 +rnode "VOUT.n325" 0 0 650 -1229 0 +rnode "VOUT.t7" 0 0 758 448 0 +rnode "VOUT.n326" 0 0 650 1229 0 +rnode "VOUT.n327" 0 0 850 1229 0 +rnode "VOUT.n328" 0 0 650 1229 0 +rnode "VOUT.n329" 0 0 850 1229 0 +rnode "VOUT.n330" 0 0 1050 1229 0 +rnode "VOUT.n331" 0 0 850 1229 0 +rnode "VOUT.n332" 0 0 950 1229 0 +rnode "VOUT.n333" 0 0 950 1229 0 +rnode "VOUT.n334" 0 0 950 1229 0 +rnode "VOUT.n335" 0 0 950 1229 0 +rnode "VOUT.n336" 0 0 850 1229 0 +rnode "VOUT.n337" 0 0 750 1229 0 +rnode "VOUT.n338" 0 0 650 1229 0 +rnode "VOUT.n339" 0 0 550 1229 0 +rnode "VOUT.n340" 0 0 450 1229 0 +rnode "VOUT.n341" 0 0 450 1229 0 +rnode "VOUT.n342" 0 0 550 -1229 0 +rnode "VOUT.n343" 0 0 450 -1229 0 +rnode "VOUT.n344" 0 0 350 -1229 0 +rnode "VOUT.n345" 0 0 250 1229 0 +rnode "VOUT.n346" 0 0 250 1229 0 +rnode "VOUT.n347" 0 0 450 1229 0 +rnode "VOUT.n348" 0 0 350 1229 0 +rnode "VOUT.n349" 0 0 250 1229 0 +rnode "VOUT.n350" 0 0 150 1229 0 +rnode "VOUT.n351" 0 0 50 1229 0 +rnode "VOUT.n352" 0 0 50 1229 0 +rnode "VOUT.n353" 0 0 150 -1229 0 +rnode "VOUT.n354" 0 0 50 -1229 0 +rnode "VOUT.n355" 0 0 -50 -1229 0 +rnode "VOUT.n356" 0 0 -150 1229 0 +rnode "VOUT.n357" 0 0 -150 1229 0 +rnode "VOUT.n358" 0 0 50 1229 0 +rnode "VOUT.n359" 0 0 -50 1229 0 +rnode "VOUT.n360" 0 0 -150 1229 0 +rnode "VOUT.n361" 0 0 -250 1229 0 +rnode "VOUT.n362" 0 0 -350 1229 0 +rnode "VOUT.n363" 0 0 -350 1229 0 +rnode "VOUT.n364" 0 0 -250 -1229 0 +rnode "VOUT.n365" 0 0 -350 -1229 0 +rnode "VOUT.n366" 0 0 -450 -1229 0 +rnode "VOUT.n367" 0 0 -550 1229 0 +rnode "VOUT.n368" 0 0 -550 1229 0 +rnode "VOUT.n369" 0 0 -350 1229 0 +rnode "VOUT.n370" 0 0 -450 1229 0 +rnode "VOUT.n371" 0 0 -550 1229 0 +rnode "VOUT.n372" 0 0 -650 1229 0 +rnode "VOUT.n373" 0 0 -750 1229 0 +rnode "VOUT.n374" 0 0 -750 1229 0 +rnode "VOUT.n375" 0 0 -650 -1229 0 +rnode "VOUT.n376" 0 0 -750 -1229 0 +rnode "VOUT.n377" 0 0 -850 -1229 0 +rnode "VOUT.n378" 0 0 -950 1229 0 +rnode "VOUT.n379" 0 0 -950 1229 0 +rnode "VOUT.n380" 0 0 -750 1229 0 +rnode "VOUT.n381" 0 0 -850 1229 0 +rnode "VOUT.n382" 0 0 -950 1229 0 +rnode "VOUT.n383" 0 0 -1050 1229 0 +rnode "VOUT.n384" 0 0 -1246 1088 0 +rnode "VOUT.n385" 0 0 -1050 -1229 0 +rnode "VOUT.n386" 0 0 -1246 -1088 0 +rnode "VOUT.n387" 0 0 -1246 -952 0 +rnode "VOUT.n388" 0 0 -1246 -816 0 +rnode "VOUT.n389" 0 0 -1246 -680 0 +rnode "VOUT.n390" 0 0 -1246 -544 0 +rnode "VOUT.n391" 0 0 -1246 -408 0 +rnode "VOUT.n392" 0 0 -1246 -272 0 +rnode "VOUT.n393" 0 0 -1246 -136 0 +rnode "VOUT.n394" 0 0 -1246 0 0 +rnode "VOUT.n395" 0 0 -1246 136 0 +rnode "VOUT.n396" 0 0 -1246 272 0 +rnode "VOUT.n397" 0 0 -1246 408 0 +rnode "VOUT.n398" 0 0 -1246 544 0 +rnode "VOUT.n399" 0 0 -1246 680 0 +rnode "VOUT.n400" 0 0 -1246 816 0 +rnode "VOUT.n401" 0 0 -1246 1020 0 +rnode "VOUT.n402" 0 0 -1246 884 0 +rnode "VOUT.n403" 0 0 -1246 1088 0 +rnode "VOUT.n404" 0 0 -1246 1020 0 +rnode "VOUT.t17" 0 0 -995 448 0 +rnode "VOUT.t16" 0 0 -521 448 0 +rnode "VOUT.t14" 0 0 -758 448 0 +rnode "VOUT.n405" 0 0 -758 165 0 +rnode "VOUT.n406" 0 0 -1028 198 0 +rnode "VOUT.t20" 0 0 -995 -664 0 +rnode "VOUT.t19" 0 0 -521 -664 0 +rnode "VOUT.t18" 0 0 -758 -664 0 +rnode "VOUT.n407" 0 0 -758 -947 0 +rnode "VOUT.n408" 0 0 -1028 -914 0 +rnode "VOUT.n409" 0 0 -950 -1229 0 +rnode "VOUT.n410" 0 0 -750 -1229 0 +rnode "VOUT.n411" 0 0 -550 -1229 0 +rnode "VOUT.n412" 0 0 -350 -1229 0 +rnode "VOUT.n413" 0 0 -150 -1229 0 +rnode "VOUT.n414" 0 0 50 -1229 0 +rnode "VOUT.n415" 0 0 250 -1229 0 +rnode "VOUT.n416" 0 0 450 -1229 0 +rnode "VOUT.n417" 0 0 550 -1229 0 +rnode "VOUT.n418" 0 0 550 -1229 0 +rnode "VOUT.n419" 0 0 450 -1229 0 +rnode "VOUT.n420" 0 0 350 -1229 0 +rnode "VOUT.n421" 0 0 350 -1229 0 +rnode "VOUT.n422" 0 0 250 -1229 0 +rnode "VOUT.n423" 0 0 250 -1229 0 +rnode "VOUT.n424" 0 0 150 -1229 0 +rnode "VOUT.n425" 0 0 150 -1229 0 +rnode "VOUT.n426" 0 0 50 -1229 0 +rnode "VOUT.n427" 0 0 -50 -1229 0 +rnode "VOUT.n428" 0 0 -50 -1229 0 +rnode "VOUT.n429" 0 0 -150 -1229 0 +rnode "VOUT.n430" 0 0 -150 -1229 0 +rnode "VOUT.n431" 0 0 -250 -1229 0 +rnode "VOUT.n432" 0 0 -250 -1229 0 +rnode "VOUT.n433" 0 0 -350 -1229 0 +rnode "VOUT.n434" 0 0 -450 -1229 0 +rnode "VOUT.n435" 0 0 -450 -1229 0 +rnode "VOUT.n436" 0 0 -550 -1229 0 +rnode "VOUT.n437" 0 0 -550 -1229 0 +rnode "VOUT.n438" 0 0 -650 -1229 0 +rnode "VOUT.n439" 0 0 -650 -1229 0 +rnode "VOUT.n440" 0 0 -750 -1229 0 +rnode "VOUT.n441" 0 0 -850 -1229 0 +rnode "VOUT.n442" 0 0 -850 -1229 0 +rnode "VOUT.n443" 0 0 -950 -1229 0 +rnode "VOUT.n444" 0 0 -950 -1229 0 +rnode "VOUT.n445" 0 0 -1050 -1229 0 +rnode "VOUT.n446" 0 0 -1050 -1229 0 +rnode "VOUT.n447" 0 0 -1246 -1088 0 +rnode "VOUT.n448" 0 0 -1246 -1088 0 +rnode "VOUT.n449" 0 0 -1246 -1020 0 +rnode "VOUT.n450" 0 0 -1246 -1020 0 +rnode "VOUT.n451" 0 0 -1246 -952 0 +rnode "VOUT.n452" 0 0 -1246 -952 0 +rnode "VOUT.n453" 0 0 -1205 -947 0 +rnode "VOUT.n454" 0 0 -1246 -884 0 +rnode "VOUT.n455" 0 0 -1246 -884 0 +rnode "VOUT.n456" 0 0 -1246 -816 0 +rnode "VOUT.n457" 0 0 -1246 -816 0 +rnode "VOUT.n458" 0 0 -1246 -748 0 +rnode "VOUT.n459" 0 0 -1246 -748 0 +rnode "VOUT.n460" 0 0 -1246 -680 0 +rnode "VOUT.n461" 0 0 -1246 -680 0 +rnode "VOUT.n462" 0 0 -1246 -612 0 +rnode "VOUT.n463" 0 0 -1246 -612 0 +rnode "VOUT.n464" 0 0 -1246 -544 0 +rnode "VOUT.n465" 0 0 -1246 -544 0 +rnode "VOUT.n466" 0 0 -1246 -476 0 +rnode "VOUT.n467" 0 0 -1246 -476 0 +rnode "VOUT.n468" 0 0 -1246 -408 0 +rnode "VOUT.n469" 0 0 -1246 -408 0 +rnode "VOUT.n470" 0 0 -1246 -340 0 +rnode "VOUT.n471" 0 0 -1246 -340 0 +rnode "VOUT.n472" 0 0 -1246 -272 0 +rnode "VOUT.n473" 0 0 -1246 -272 0 +rnode "VOUT.n474" 0 0 -1246 -204 0 +rnode "VOUT.n475" 0 0 -1246 -204 0 +rnode "VOUT.n476" 0 0 -1246 -136 0 +rnode "VOUT.n477" 0 0 -1246 -136 0 +rnode "VOUT.n478" 0 0 -1246 -68 0 +rnode "VOUT.n479" 0 0 -1246 -68 0 +rnode "VOUT.n480" 0 0 -1246 0 0 +rnode "VOUT.n481" 0 0 -1246 0 0 +rnode "VOUT.n482" 0 0 -1246 68 0 +rnode "VOUT.n483" 0 0 -1246 68 0 +rnode "VOUT.n484" 0 0 -1246 136 0 +rnode "VOUT.n485" 0 0 -1246 136 0 +rnode "VOUT.n486" 0 0 -1205 165 0 +rnode "VOUT.n487" 0 0 -1246 204 0 +rnode "VOUT.n488" 0 0 -1246 204 0 +rnode "VOUT.n489" 0 0 -1246 272 0 +rnode "VOUT.n490" 0 0 -1246 272 0 +rnode "VOUT.n491" 0 0 -1246 340 0 +rnode "VOUT.n492" 0 0 -1246 340 0 +rnode "VOUT.n493" 0 0 -1246 408 0 +rnode "VOUT.n494" 0 0 -1246 408 0 +rnode "VOUT.n495" 0 0 -1246 476 0 +rnode "VOUT.n496" 0 0 -1246 476 0 +rnode "VOUT.n497" 0 0 -1246 544 0 +rnode "VOUT.n498" 0 0 -1246 544 0 +rnode "VOUT.n499" 0 0 -1246 612 0 +rnode "VOUT.n500" 0 0 -1246 612 0 +rnode "VOUT.n501" 0 0 -1246 680 0 +rnode "VOUT.n502" 0 0 -1246 680 0 +rnode "VOUT.n503" 0 0 -1246 748 0 +rnode "VOUT.n504" 0 0 -1246 748 0 +rnode "VOUT.n505" 0 0 -1246 816 0 +rnode "VOUT.n506" 0 0 -1246 816 0 +rnode "VOUT.n507" 0 0 -1246 884 0 +rnode "VOUT.n508" 0 0 -1246 952 0 +rnode "VOUT.n509" 0 0 -1246 952 0 +rnode "VOUT.n510" 0 0 -1246 952 0 +rnode "VOUT.n511" 0 0 -1246 1088 0 +rnode "VOUT.n512" 0 0 -1050 1229 0 +rnode "VOUT.n513" 0 0 -1050 1229 0 +rnode "VOUT.n514" 0 0 -1050 1229 0 +rnode "VOUT.n515" 0 0 -950 1229 0 +rnode "VOUT.n516" 0 0 -850 1229 0 +rnode "VOUT.n517" 0 0 -850 1229 0 +rnode "VOUT.n518" 0 0 -850 1229 0 +rnode "VOUT.t15" 0 0 -758 448 0 +rnode "VOUT.n519" 0 0 -750 1229 0 +rnode "VOUT.n520" 0 0 -650 1229 0 +rnode "VOUT.n521" 0 0 -650 1229 0 +rnode "VOUT.n522" 0 0 -650 1229 0 +rnode "VOUT.n523" 0 0 -550 1229 0 +rnode "VOUT.n524" 0 0 -450 1229 0 +rnode "VOUT.n525" 0 0 -450 1229 0 +rnode "VOUT.n526" 0 0 -450 1229 0 +rnode "VOUT.n527" 0 0 -350 1229 0 +rnode "VOUT.n528" 0 0 -250 1229 0 +rnode "VOUT.n529" 0 0 -250 1229 0 +rnode "VOUT.n530" 0 0 -250 1229 0 +rnode "VOUT.n531" 0 0 -150 1229 0 +rnode "VOUT.n532" 0 0 -50 1229 0 +rnode "VOUT.n533" 0 0 -50 1229 0 +rnode "VOUT.n534" 0 0 -50 1229 0 +rnode "VOUT.t3" 0 0 0 448 0 +rnode "VOUT.n535" 0 0 50 1229 0 +rnode "VOUT.n536" 0 0 150 1229 0 +rnode "VOUT.n537" 0 0 150 1229 0 +rnode "VOUT.n538" 0 0 150 1229 0 +rnode "VOUT.n539" 0 0 250 1229 0 +rnode "VOUT.n540" 0 0 350 1229 0 +rnode "VOUT.n541" 0 0 350 1229 0 +rnode "VOUT.n542" 0 0 350 1229 0 +rnode "VOUT.n543" 0 0 450 1229 0 +rnode "VOUT.n544" 0 0 550 1229 0 +rnode "VOUT.n545" 0 0 550 1229 0 +rnode "VOUT.n546" 0 0 550 1229 0 +rnode "VOUT.n547" 0 0 650 1229 0 +rnode "VOUT.n548" 0 0 750 1229 0 +rnode "VOUT.n549" 0 0 750 1229 0 +rnode "VOUT.n550" 0 0 750 1229 0 +rnode "VOUT.n551" 0 0 750 -1229 0 +rnode "VOUT.n552" 0 0 750 -1229 0 +rnode "VOUT.n553" 0 0 750 -1229 0 +rnode "VOUT.n554" 0 0 850 -1229 0 +rnode "VOUT.n555" 0 0 950 -1229 0 +rnode "VOUT.n556" 0 0 950 -1229 0 +rnode "VOUT.n557" 0 0 1050 -1229 0 +rnode "VOUT.n558" 0 0 1050 -1229 0 +rnode "VOUT.n559" 0 0 1246 -1088 0 +rnode "VOUT.n560" 0 0 1246 -1088 0 +rnode "VOUT.n561" 0 0 1246 -1020 0 +rnode "VOUT.n562" 0 0 1246 -1020 0 +rnode "VOUT.n563" 0 0 1246 -952 0 +rnode "VOUT.n564" 0 0 1246 -952 0 +rnode "VOUT.n565" 0 0 1205 -947 0 +rnode "VOUT.n566" 0 0 1246 -884 0 +rnode "VOUT.n567" 0 0 1246 -884 0 +rnode "VOUT.n568" 0 0 1246 -816 0 +rnode "VOUT.n569" 0 0 1246 -816 0 +rnode "VOUT.n570" 0 0 1246 -748 0 +rnode "VOUT.n571" 0 0 1246 -748 0 +rnode "VOUT.n572" 0 0 1246 -680 0 +rnode "VOUT.n573" 0 0 1246 -680 0 +rnode "VOUT.n574" 0 0 1246 -612 0 +rnode "VOUT.n575" 0 0 1246 -612 0 +rnode "VOUT.n576" 0 0 1246 -544 0 +rnode "VOUT.n577" 0 0 1246 -544 0 +rnode "VOUT.n578" 0 0 1246 -476 0 +rnode "VOUT.n579" 0 0 1246 -476 0 +rnode "VOUT.n580" 0 0 1246 -408 0 +rnode "VOUT.n581" 0 0 1246 -408 0 +rnode "VOUT.n582" 0 0 1246 -340 0 +rnode "VOUT.n583" 0 0 1246 -340 0 +rnode "VOUT.n584" 0 0 1246 -272 0 +rnode "VOUT.n585" 0 0 1246 -272 0 +rnode "VOUT.n586" 0 0 1246 -204 0 +rnode "VOUT.n587" 0 0 1246 -204 0 +rnode "VOUT.n588" 0 0 1246 -136 0 +rnode "VOUT.n589" 0 0 1246 -136 0 +rnode "VOUT.n590" 0 0 1246 -68 0 +rnode "VOUT.n591" 0 0 1246 -68 0 +rnode "VOUT.n592" 0 0 1246 0 0 +rnode "VOUT.n593" 0 0 1246 0 0 +rnode "VOUT.n594" 0 0 1246 68 0 +rnode "VOUT.n595" 0 0 1246 68 0 +rnode "VOUT.n596" 0 0 1246 136 0 +rnode "VOUT.n597" 0 0 1246 136 0 +rnode "VOUT.n598" 0 0 1205 165 0 +rnode "VOUT.n599" 0 0 1246 204 0 +rnode "VOUT.n600" 0 0 1246 204 0 +rnode "VOUT.n601" 0 0 1246 272 0 +rnode "VOUT.n602" 0 0 1246 272 0 +rnode "VOUT.n603" 0 0 1246 340 0 +rnode "VOUT.n604" 0 0 1246 340 0 +rnode "VOUT.n605" 0 0 1246 408 0 +rnode "VOUT.n606" 0 0 1246 408 0 +rnode "VOUT.n607" 0 0 1246 476 0 +rnode "VOUT.n608" 0 0 1246 476 0 +rnode "VOUT.n609" 0 0 1246 544 0 +rnode "VOUT.n610" 0 0 1246 544 0 +rnode "VOUT.n611" 0 0 1246 612 0 +rnode "VOUT.n612" 0 0 1246 612 0 +rnode "VOUT.n613" 0 0 1246 680 0 +rnode "VOUT.n614" 0 0 1246 680 0 +rnode "VOUT.n615" 0 0 1246 748 0 +rnode "VOUT.n616" 0 0 1246 748 0 +rnode "VOUT.n617" 0 0 1246 816 0 +rnode "VOUT.n618" 0 0 1246 816 0 +rnode "VOUT.n619" 0 0 1246 884 0 +rnode "VOUT.n620" 0 0 1246 884 0 +rnode "VOUT.n621" 0 0 1246 952 0 +rnode "VOUT.n622" 0 0 1246 1020 0 +rnode "VOUT.n623" 0 0 1246 1088 0 +rnode "VOUT.n624" 0 0 1246 1088 0 +rnode "VOUT.n625" 0 0 1246 1088 0 +rnode "VOUT.n626" 0 0 1246 1088 0 +rnode "VOUT.n627" 0 0 1432 918 0 +rnode "VOUT.n628" 0 0 1608 1029 0 +rnode "VOUT.n629" 0 0 1608 1029 0 +rnode "VOUT.n630" 0 0 1608 1029 0 +rnode "VOUT.n631" 0 0 1608 1029 0 +rnode "VOUT.n632" 0 0 1708 1029 0 +rnode "VOUT.n633" 0 0 1808 1029 0 +rnode "VOUT.n634" 0 0 1808 1029 0 +rnode "VOUT.n635" 0 0 1908 1029 0 +rnode "VOUT.n636" 0 0 2008 1029 0 +rnode "VOUT.n637" 0 0 2008 1029 0 +rnode "VOUT.n638" 0 0 2108 1029 0 +rnode "VOUT.n639" 0 0 2208 1029 0 +rnode "VOUT.n640" 0 0 2208 1029 0 +rnode "VOUT.n641" 0 0 2308 1029 0 +rnode "VOUT.n642" 0 0 2408 1029 0 +rnode "VOUT.n643" 0 0 2408 1029 0 +rnode "VBULK" 0 0 2508 1029 0 +resist "VOUT.n89" "VOUT.n88" 0.0247093 +resist "VOUT.n87" "VOUT" 0.07125 +resist "VBULK" "VOUT.n0" 0.125 +resist "VOUT.n632" "VOUT.n631" 0.152439 +resist "VOUT.n633" "VOUT.n632" 0.152439 +resist "VOUT.n633" "VOUT.n7" 0.152439 +resist "VOUT.n637" "VOUT.n7" 0.152439 +resist "VOUT.n638" "VOUT.n637" 0.152439 +resist "VOUT.n639" "VOUT.n638" 0.152439 +resist "VOUT.n639" "VOUT.n2" 0.152439 +resist "VOUT.n643" "VOUT.n2" 0.152439 +resist "VBULK" "VOUT.n643" 0.152439 +resist "VOUT.n260" "VOUT.n0" 0.152439 +resist "VOUT.n260" "VOUT.n259" 0.152439 +resist "VOUT.n259" "VOUT.n258" 0.152439 +resist "VOUT.n258" "VOUT.n129" 0.152439 +resist "VOUT.n242" "VOUT.n129" 0.152439 +resist "VOUT.n242" "VOUT.n241" 0.152439 +resist "VOUT.n241" "VOUT.n240" 0.152439 +resist "VOUT.n240" "VOUT.n142" 0.152439 +resist "VOUT.n225" "VOUT.n142" 0.152439 +resist "VOUT.n291" "VOUT.n108" 0.152439 +resist "VOUT.n279" "VOUT.n108" 0.152439 +resist "VOUT.n280" "VOUT.n279" 0.152439 +resist "VOUT.n281" "VOUT.n280" 0.152439 +resist "VOUT.n281" "VOUT.n278" 0.152439 +resist "VOUT.n278" "VOUT.n277" 0.152439 +resist "VOUT.n277" "VOUT.n116" 0.152439 +resist "VOUT.n269" "VOUT.n116" 0.152439 +resist "VOUT.n269" "VOUT.n268" 0.152439 +resist "VOUT.n268" "VOUT.n267" 0.152439 +resist "VOUT.n267" "VOUT.n122" 0.152439 +resist "VOUT.n251" "VOUT.n122" 0.152439 +resist "VOUT.n251" "VOUT.n250" 0.152439 +resist "VOUT.n250" "VOUT.n249" 0.152439 +resist "VOUT.n249" "VOUT.n136" 0.152439 +resist "VOUT.n233" "VOUT.n136" 0.152439 +resist "VOUT.n234" "VOUT.n233" 0.152439 +resist "VOUT.n234" "VOUT.n232" 0.152439 +resist "VOUT.n232" "VOUT.n231" 0.152439 +resist "VOUT.n383" "VOUT.n382" 0.152439 +resist "VOUT.n382" "VOUT.n381" 0.152439 +resist "VOUT.n381" "VOUT.n380" 0.152439 +resist "VOUT.n380" "VOUT.n372" 0.152439 +resist "VOUT.n372" "VOUT.n371" 0.152439 +resist "VOUT.n371" "VOUT.n370" 0.152439 +resist "VOUT.n370" "VOUT.n369" 0.152439 +resist "VOUT.n369" "VOUT.n361" 0.152439 +resist "VOUT.n361" "VOUT.n360" 0.152439 +resist "VOUT.n360" "VOUT.n359" 0.152439 +resist "VOUT.n359" "VOUT.n358" 0.152439 +resist "VOUT.n358" "VOUT.n350" 0.152439 +resist "VOUT.n350" "VOUT.n349" 0.152439 +resist "VOUT.n349" "VOUT.n348" 0.152439 +resist "VOUT.n348" "VOUT.n347" 0.152439 +resist "VOUT.n347" "VOUT.n339" 0.152439 +resist "VOUT.n339" "VOUT.n338" 0.152439 +resist "VOUT.n338" "VOUT.n337" 0.152439 +resist "VOUT.n337" "VOUT.n336" 0.152439 +resist "VOUT.n336" "VOUT.n335" 0.152439 +resist "VOUT.n335" "VOUT.n314" 0.152439 +resist "VOUT.n446" "VOUT.n409" 0.152439 +resist "VOUT.n441" "VOUT.n409" 0.152439 +resist "VOUT.n441" "VOUT.n440" 0.152439 +resist "VOUT.n440" "VOUT.n439" 0.152439 +resist "VOUT.n439" "VOUT.n411" 0.152439 +resist "VOUT.n434" "VOUT.n411" 0.152439 +resist "VOUT.n434" "VOUT.n433" 0.152439 +resist "VOUT.n433" "VOUT.n432" 0.152439 +resist "VOUT.n432" "VOUT.n413" 0.152439 +resist "VOUT.n427" "VOUT.n413" 0.152439 +resist "VOUT.n427" "VOUT.n426" 0.152439 +resist "VOUT.n426" "VOUT.n425" 0.152439 +resist "VOUT.n425" "VOUT.n415" 0.152439 +resist "VOUT.n420" "VOUT.n415" 0.152439 +resist "VOUT.n420" "VOUT.n419" 0.152439 +resist "VOUT.n419" "VOUT.n418" 0.152439 +resist "VOUT.n418" "VOUT.n322" 0.152439 +resist "VOUT.n553" "VOUT.n322" 0.152439 +resist "VOUT.n554" "VOUT.n553" 0.152439 +resist "VOUT.n555" "VOUT.n554" 0.152439 +resist "VOUT.n555" "VOUT.n319" 0.152439 +resist "VOUT.n56" "VOUT.n35" 0.780488 +resist "VOUT.n203" "VOUT.n202" 0.780488 +resist "VOUT.n565" "VOUT.n564" 0.780488 +resist "VOUT.n453" "VOUT.n452" 0.780488 +resist "VOUT.n91" "VOUT.n71" 2.18537 +resist "VOUT.n77" "VOUT.n73" 3.44721 +resist "VOUT.n84" "VOUT.n80" 3.44721 +resist "VOUT.n598" "VOUT.n597" 4.52683 +resist "VOUT.n486" "VOUT.n485" 4.52683 +resist "VOUT.n104" "VOUT.n103" 5.15122 +resist "VOUT.n177" "VOUT.n169" 5.15122 +resist "VOUT.n87" "VOUT.n86" 5.15589 +resist "VOUT.n106" "VOUT.n104" 5.46341 +resist "VOUT.n173" "VOUT.n169" 5.46341 +resist "VOUT.n76" "VOUT.n72" 5.81818 +resist "VOUT.n83" "VOUT.n79" 5.81818 +resist "VOUT.n599" "VOUT.n598" 6.0878 +resist "VOUT.n487" "VOUT.n486" 6.0878 +resist "VOUT.n76" "VOUT.n75" 7.3697 +resist "VOUT.n83" "VOUT.n82" 7.3697 +resist "VOUT.n78" "VOUT.n72" 8.14545 +resist "VOUT.n85" "VOUT.n79" 8.14545 +resist "VOUT.n92" "VOUT.n91" 8.42927 +resist "VOUT.n631" "VOUT.n630" 9.3 +resist "VOUT.n632" "VOUT.n11" 9.3 +resist "VOUT.n634" "VOUT.n633" 9.3 +resist "VOUT.n635" "VOUT.n7" 9.3 +resist "VOUT.n637" "VOUT.n636" 9.3 +resist "VOUT.n638" "VOUT.n6" 9.3 +resist "VOUT.n640" "VOUT.n639" 9.3 +resist "VOUT.n641" "VOUT.n2" 9.3 +resist "VOUT.n643" "VOUT.n642" 9.3 +resist "VBULK" "VOUT.n1" 9.3 +resist "VOUT.n226" "VOUT.n225" 9.3 +resist "VOUT.n262" "VOUT.n0" 9.3 +resist "VOUT.n261" "VOUT.n260" 9.3 +resist "VOUT.n259" "VOUT.n128" 9.3 +resist "VOUT.n258" "VOUT.n257" 9.3 +resist "VOUT.n130" "VOUT.n129" 9.3 +resist "VOUT.n243" "VOUT.n242" 9.3 +resist "VOUT.n241" "VOUT.n141" 9.3 +resist "VOUT.n240" "VOUT.n239" 9.3 +resist "VOUT.n143" "VOUT.n142" 9.3 +resist "VOUT.n231" "VOUT.n230" 9.3 +resist "VOUT.n291" "VOUT.n290" 9.3 +resist "VOUT.n289" "VOUT.n108" 9.3 +resist "VOUT.n279" "VOUT.n109" 9.3 +resist "VOUT.n280" "VOUT.n115" 9.3 +resist "VOUT.n282" "VOUT.n281" 9.3 +resist "VOUT.n278" "VOUT.n114" 9.3 +resist "VOUT.n277" "VOUT.n276" 9.3 +resist "VOUT.n117" "VOUT.n116" 9.3 +resist "VOUT.n270" "VOUT.n269" 9.3 +resist "VOUT.n268" "VOUT.n121" 9.3 +resist "VOUT.n267" "VOUT.n266" 9.3 +resist "VOUT.n123" "VOUT.n122" 9.3 +resist "VOUT.n252" "VOUT.n251" 9.3 +resist "VOUT.n250" "VOUT.n135" 9.3 +resist "VOUT.n249" "VOUT.n248" 9.3 +resist "VOUT.n137" "VOUT.n136" 9.3 +resist "VOUT.n233" "VOUT.n148" 9.3 +resist "VOUT.n235" "VOUT.n234" 9.3 +resist "VOUT.n232" "VOUT.n147" 9.3 +resist "VOUT.n514" "VOUT.n383" 9.3 +resist "VOUT.n515" "VOUT.n382" 9.3 +resist "VOUT.n516" "VOUT.n381" 9.3 +resist "VOUT.n380" "VOUT.n373" 9.3 +resist "VOUT.n522" "VOUT.n372" 9.3 +resist "VOUT.n523" "VOUT.n371" 9.3 +resist "VOUT.n524" "VOUT.n370" 9.3 +resist "VOUT.n369" "VOUT.n362" 9.3 +resist "VOUT.n530" "VOUT.n361" 9.3 +resist "VOUT.n531" "VOUT.n360" 9.3 +resist "VOUT.n532" "VOUT.n359" 9.3 +resist "VOUT.n358" "VOUT.n351" 9.3 +resist "VOUT.n538" "VOUT.n350" 9.3 +resist "VOUT.n539" "VOUT.n349" 9.3 +resist "VOUT.n540" "VOUT.n348" 9.3 +resist "VOUT.n347" "VOUT.n340" 9.3 +resist "VOUT.n546" "VOUT.n339" 9.3 +resist "VOUT.n547" "VOUT.n338" 9.3 +resist "VOUT.n548" "VOUT.n337" 9.3 +resist "VOUT.n336" "VOUT.n329" 9.3 +resist "VOUT.n335" "VOUT.n334" 9.3 +resist "VOUT.n330" "VOUT.n314" 9.3 +resist "VOUT.n557" "VOUT.n319" 9.3 +resist "VOUT.n446" "VOUT.n445" 9.3 +resist "VOUT.n444" "VOUT.n409" 9.3 +resist "VOUT.n442" "VOUT.n441" 9.3 +resist "VOUT.n440" "VOUT.n410" 9.3 +resist "VOUT.n439" "VOUT.n438" 9.3 +resist "VOUT.n437" "VOUT.n411" 9.3 +resist "VOUT.n435" "VOUT.n434" 9.3 +resist "VOUT.n433" "VOUT.n412" 9.3 +resist "VOUT.n432" "VOUT.n431" 9.3 +resist "VOUT.n430" "VOUT.n413" 9.3 +resist "VOUT.n428" "VOUT.n427" 9.3 +resist "VOUT.n426" "VOUT.n414" 9.3 +resist "VOUT.n425" "VOUT.n424" 9.3 +resist "VOUT.n423" "VOUT.n415" 9.3 +resist "VOUT.n421" "VOUT.n420" 9.3 +resist "VOUT.n419" "VOUT.n416" 9.3 +resist "VOUT.n418" "VOUT.n417" 9.3 +resist "VOUT.n323" "VOUT.n322" 9.3 +resist "VOUT.n553" "VOUT.n552" 9.3 +resist "VOUT.n554" "VOUT.n321" 9.3 +resist "VOUT.n556" "VOUT.n555" 9.3 +resist "VOUT.n77" "VOUT.n76" 9.3 +resist "VOUT.n84" "VOUT.n83" 9.3 +resist "VOUT.n78" "VOUT.n77" 9.45517 +resist "VOUT.n85" "VOUT.n84" 9.45517 +resist "VOUT.n75" "VOUT.n73" 9.71124 +resist "VOUT.n82" "VOUT.n80" 9.71124 +resist "VOUT.n59" "VOUT.n35" 9.83415 +resist "VOUT.n202" "VOUT.n201" 9.83415 +resist "VOUT.n566" "VOUT.n565" 9.83415 +resist "VOUT.n454" "VOUT.n453" 9.83415 +resist "VOUT.n292" "VOUT.n107" 10.6146 +resist "VOUT.n107" "VOUT.n106" 10.6146 +resist "VOUT.n103" "VOUT.n100" 10.6146 +resist "VOUT.n100" "VOUT.n99" 10.6146 +resist "VOUT.n99" "VOUT.n96" 10.6146 +resist "VOUT.n96" "VOUT.n95" 10.6146 +resist "VOUT.n95" "VOUT.n92" 10.6146 +resist "VOUT.n71" "VOUT.n68" 10.6146 +resist "VOUT.n68" "VOUT.n67" 10.6146 +resist "VOUT.n67" "VOUT.n64" 10.6146 +resist "VOUT.n64" "VOUT.n63" 10.6146 +resist "VOUT.n63" "VOUT.n60" 10.6146 +resist "VOUT.n60" "VOUT.n59" 10.6146 +resist "VOUT.n56" "VOUT.n55" 10.6146 +resist "VOUT.n55" "VOUT.n52" 10.6146 +resist "VOUT.n52" "VOUT.n51" 10.6146 +resist "VOUT.n51" "VOUT.n48" 10.6146 +resist "VOUT.n48" "VOUT.n47" 10.6146 +resist "VOUT.n47" "VOUT.n44" 10.6146 +resist "VOUT.n44" "VOUT.n43" 10.6146 +resist "VOUT.n43" "VOUT.n40" 10.6146 +resist "VOUT.n40" "VOUT.n39" 10.6146 +resist "VOUT.n39" "VOUT.n36" 10.6146 +resist "VOUT.n36" "VOUT.n12" 10.6146 +resist "VOUT.n172" "VOUT.n149" 10.6146 +resist "VOUT.n173" "VOUT.n172" 10.6146 +resist "VOUT.n178" "VOUT.n177" 10.6146 +resist "VOUT.n179" "VOUT.n178" 10.6146 +resist "VOUT.n179" "VOUT.n165" 10.6146 +resist "VOUT.n185" "VOUT.n165" 10.6146 +resist "VOUT.n186" "VOUT.n185" 10.6146 +resist "VOUT.n187" "VOUT.n186" 10.6146 +resist "VOUT.n187" "VOUT.n163" 10.6146 +resist "VOUT.n193" "VOUT.n163" 10.6146 +resist "VOUT.n194" "VOUT.n193" 10.6146 +resist "VOUT.n195" "VOUT.n194" 10.6146 +resist "VOUT.n195" "VOUT.n161" 10.6146 +resist "VOUT.n201" "VOUT.n161" 10.6146 +resist "VOUT.n204" "VOUT.n203" 10.6146 +resist "VOUT.n204" "VOUT.n157" 10.6146 +resist "VOUT.n210" "VOUT.n157" 10.6146 +resist "VOUT.n211" "VOUT.n210" 10.6146 +resist "VOUT.n212" "VOUT.n211" 10.6146 +resist "VOUT.n212" "VOUT.n155" 10.6146 +resist "VOUT.n217" "VOUT.n155" 10.6146 +resist "VOUT.n218" "VOUT.n217" 10.6146 +resist "VOUT.n218" "VOUT.n153" 10.6146 +resist "VOUT.n223" "VOUT.n153" 10.6146 +resist "VOUT.n224" "VOUT.n223" 10.6146 +resist "VOUT.n561" "VOUT.n560" 10.6146 +resist "VOUT.n564" "VOUT.n561" 10.6146 +resist "VOUT.n569" "VOUT.n566" 10.6146 +resist "VOUT.n570" "VOUT.n569" 10.6146 +resist "VOUT.n573" "VOUT.n570" 10.6146 +resist "VOUT.n574" "VOUT.n573" 10.6146 +resist "VOUT.n577" "VOUT.n574" 10.6146 +resist "VOUT.n578" "VOUT.n577" 10.6146 +resist "VOUT.n581" "VOUT.n578" 10.6146 +resist "VOUT.n582" "VOUT.n581" 10.6146 +resist "VOUT.n585" "VOUT.n582" 10.6146 +resist "VOUT.n586" "VOUT.n585" 10.6146 +resist "VOUT.n589" "VOUT.n586" 10.6146 +resist "VOUT.n590" "VOUT.n589" 10.6146 +resist "VOUT.n593" "VOUT.n590" 10.6146 +resist "VOUT.n594" "VOUT.n593" 10.6146 +resist "VOUT.n597" "VOUT.n594" 10.6146 +resist "VOUT.n602" "VOUT.n599" 10.6146 +resist "VOUT.n603" "VOUT.n602" 10.6146 +resist "VOUT.n606" "VOUT.n603" 10.6146 +resist "VOUT.n607" "VOUT.n606" 10.6146 +resist "VOUT.n610" "VOUT.n607" 10.6146 +resist "VOUT.n611" "VOUT.n610" 10.6146 +resist "VOUT.n614" "VOUT.n611" 10.6146 +resist "VOUT.n615" "VOUT.n614" 10.6146 +resist "VOUT.n618" "VOUT.n615" 10.6146 +resist "VOUT.n620" "VOUT.n618" 10.6146 +resist "VOUT.n621" "VOUT.n620" 10.6146 +resist "VOUT.n622" "VOUT.n621" 10.6146 +resist "VOUT.n623" "VOUT.n622" 10.6146 +resist "VOUT.n449" "VOUT.n448" 10.6146 +resist "VOUT.n452" "VOUT.n449" 10.6146 +resist "VOUT.n457" "VOUT.n454" 10.6146 +resist "VOUT.n458" "VOUT.n457" 10.6146 +resist "VOUT.n461" "VOUT.n458" 10.6146 +resist "VOUT.n462" "VOUT.n461" 10.6146 +resist "VOUT.n465" "VOUT.n462" 10.6146 +resist "VOUT.n466" "VOUT.n465" 10.6146 +resist "VOUT.n469" "VOUT.n466" 10.6146 +resist "VOUT.n470" "VOUT.n469" 10.6146 +resist "VOUT.n473" "VOUT.n470" 10.6146 +resist "VOUT.n474" "VOUT.n473" 10.6146 +resist "VOUT.n477" "VOUT.n474" 10.6146 +resist "VOUT.n478" "VOUT.n477" 10.6146 +resist "VOUT.n481" "VOUT.n478" 10.6146 +resist "VOUT.n482" "VOUT.n481" 10.6146 +resist "VOUT.n485" "VOUT.n482" 10.6146 +resist "VOUT.n490" "VOUT.n487" 10.6146 +resist "VOUT.n491" "VOUT.n490" 10.6146 +resist "VOUT.n494" "VOUT.n491" 10.6146 +resist "VOUT.n495" "VOUT.n494" 10.6146 +resist "VOUT.n498" "VOUT.n495" 10.6146 +resist "VOUT.n499" "VOUT.n498" 10.6146 +resist "VOUT.n502" "VOUT.n499" 10.6146 +resist "VOUT.n503" "VOUT.n502" 10.6146 +resist "VOUT.n506" "VOUT.n503" 10.6146 +resist "VOUT.n507" "VOUT.n506" 10.6146 +resist "VOUT.n508" "VOUT.n507" 10.6146 +resist "VOUT.n508" "VOUT.n404" 10.6146 +resist "VOUT.n404" "VOUT.n403" 10.6146 +resist "VOUT.n519" "VOUT.t15" 12.9317 +resist "VOUT.n550" "VOUT.t7" 12.9317 +resist "VOUT.n88" "VOUT.n87" 13.0405 +resist "VOUT.n90" "VOUT.n89" 18.0633 +resist "VOUT.n290" "VOUT.n289" 19.3939 +resist "VOUT.n289" "VOUT.n109" 19.3939 +resist "VOUT.n115" "VOUT.n109" 19.3939 +resist "VOUT.n282" "VOUT.n115" 19.3939 +resist "VOUT.n282" "VOUT.n114" 19.3939 +resist "VOUT.n276" "VOUT.n114" 19.3939 +resist "VOUT.n276" "VOUT.n117" 19.3939 +resist "VOUT.n270" "VOUT.n117" 19.3939 +resist "VOUT.n270" "VOUT.n121" 19.3939 +resist "VOUT.n266" "VOUT.n121" 19.3939 +resist "VOUT.n266" "VOUT.n123" 19.3939 +resist "VOUT.n252" "VOUT.n123" 19.3939 +resist "VOUT.n252" "VOUT.n135" 19.3939 +resist "VOUT.n248" "VOUT.n135" 19.3939 +resist "VOUT.n248" "VOUT.n137" 19.3939 +resist "VOUT.n148" "VOUT.n137" 19.3939 +resist "VOUT.n235" "VOUT.n148" 19.3939 +resist "VOUT.n235" "VOUT.n147" 19.3939 +resist "VOUT.n230" "VOUT.n147" 19.3939 +resist "VOUT.n630" "VOUT.n11" 19.3939 +resist "VOUT.n634" "VOUT.n11" 19.3939 +resist "VOUT.n635" "VOUT.n634" 19.3939 +resist "VOUT.n636" "VOUT.n635" 19.3939 +resist "VOUT.n636" "VOUT.n6" 19.3939 +resist "VOUT.n640" "VOUT.n6" 19.3939 +resist "VOUT.n641" "VOUT.n640" 19.3939 +resist "VOUT.n642" "VOUT.n641" 19.3939 +resist "VOUT.n642" "VOUT.n1" 19.3939 +resist "VOUT.n262" "VOUT.n1" 19.3939 +resist "VOUT.n262" "VOUT.n261" 19.3939 +resist "VOUT.n261" "VOUT.n128" 19.3939 +resist "VOUT.n257" "VOUT.n128" 19.3939 +resist "VOUT.n257" "VOUT.n130" 19.3939 +resist "VOUT.n243" "VOUT.n130" 19.3939 +resist "VOUT.n243" "VOUT.n141" 19.3939 +resist "VOUT.n239" "VOUT.n141" 19.3939 +resist "VOUT.n239" "VOUT.n143" 19.3939 +resist "VOUT.n226" "VOUT.n143" 19.3939 +resist "VOUT.n445" "VOUT.n444" 19.3939 +resist "VOUT.n444" "VOUT.n442" 19.3939 +resist "VOUT.n442" "VOUT.n410" 19.3939 +resist "VOUT.n438" "VOUT.n410" 19.3939 +resist "VOUT.n438" "VOUT.n437" 19.3939 +resist "VOUT.n437" "VOUT.n435" 19.3939 +resist "VOUT.n435" "VOUT.n412" 19.3939 +resist "VOUT.n431" "VOUT.n412" 19.3939 +resist "VOUT.n431" "VOUT.n430" 19.3939 +resist "VOUT.n430" "VOUT.n428" 19.3939 +resist "VOUT.n428" "VOUT.n414" 19.3939 +resist "VOUT.n424" "VOUT.n414" 19.3939 +resist "VOUT.n424" "VOUT.n423" 19.3939 +resist "VOUT.n423" "VOUT.n421" 19.3939 +resist "VOUT.n421" "VOUT.n416" 19.3939 +resist "VOUT.n417" "VOUT.n416" 19.3939 +resist "VOUT.n417" "VOUT.n323" 19.3939 +resist "VOUT.n552" "VOUT.n323" 19.3939 +resist "VOUT.n552" "VOUT.n321" 19.3939 +resist "VOUT.n556" "VOUT.n321" 19.3939 +resist "VOUT.n557" "VOUT.n556" 19.3939 +resist "VOUT.n515" "VOUT.n514" 19.3939 +resist "VOUT.n516" "VOUT.n515" 19.3939 +resist "VOUT.n516" "VOUT.n373" 19.3939 +resist "VOUT.n522" "VOUT.n373" 19.3939 +resist "VOUT.n523" "VOUT.n522" 19.3939 +resist "VOUT.n524" "VOUT.n523" 19.3939 +resist "VOUT.n524" "VOUT.n362" 19.3939 +resist "VOUT.n530" "VOUT.n362" 19.3939 +resist "VOUT.n531" "VOUT.n530" 19.3939 +resist "VOUT.n532" "VOUT.n531" 19.3939 +resist "VOUT.n532" "VOUT.n351" 19.3939 +resist "VOUT.n538" "VOUT.n351" 19.3939 +resist "VOUT.n539" "VOUT.n538" 19.3939 +resist "VOUT.n540" "VOUT.n539" 19.3939 +resist "VOUT.n540" "VOUT.n340" 19.3939 +resist "VOUT.n546" "VOUT.n340" 19.3939 +resist "VOUT.n547" "VOUT.n546" 19.3939 +resist "VOUT.n548" "VOUT.n547" 19.3939 +resist "VOUT.n548" "VOUT.n329" 19.3939 +resist "VOUT.n334" "VOUT.n329" 19.3939 +resist "VOUT.n334" "VOUT.n330" 19.3939 +resist "VOUT.n292" "VOUT.n291" 26.8951 +resist "VOUT.n631" "VOUT.n12" 26.8951 +resist "VOUT.n231" "VOUT.n149" 26.8951 +resist "VOUT.n225" "VOUT.n224" 26.8951 +resist "VOUT.n560" "VOUT.n319" 31.6085 +resist "VOUT.n623" "VOUT.n314" 31.6085 +resist "VOUT.n448" "VOUT.n446" 31.6085 +resist "VOUT.n403" "VOUT.n383" 31.6085 +resist "VOUT.n104" "VOUT.n32" 34.3273 +resist "VOUT.n35" "VOUT.n34" 34.3273 +resist "VOUT.n202" "VOUT.n160" 34.3273 +resist "VOUT.n169" "VOUT.n168" 34.3273 +resist "VOUT.n598" "VOUT.n316" 34.3273 +resist "VOUT.n565" "VOUT.n318" 34.3273 +resist "VOUT.n453" "VOUT.n408" 34.3273 +resist "VOUT.n486" "VOUT.n406" 34.3273 +resist "VOUT.n32" "VOUT.n31" 44.6061 +resist "VOUT.n34" "VOUT.n33" 44.6061 +resist "VOUT.n160" "VOUT.n159" 44.6061 +resist "VOUT.n168" "VOUT.n167" 44.6061 +resist "VOUT.t11" "VOUT.n285" 45.2608 +resist "VOUT.t25" "VOUT.n139" 45.2608 +resist "VOUT.n86" "VOUT.n85" 48.0879 +resist "VOUT.n74" "VOUT.t5" 52.3077 +resist "VOUT.n81" "VOUT.t4" 52.3077 +resist "VOUT.n316" "VOUT.n315" 52.3636 +resist "VOUT.n318" "VOUT.n317" 52.3636 +resist "VOUT.n408" "VOUT.n407" 52.3636 +resist "VOUT.n406" "VOUT.n405" 52.3636 +resist "VOUT.n86" "VOUT.n78" 58.1626 +resist "VOUT.n17" "VOUT.n14" 71.6755 +resist "VOUT.n38" "VOUT.n18" 71.6755 +resist "VOUT.n42" "VOUT.n19" 71.6755 +resist "VOUT.n46" "VOUT.n20" 71.6755 +resist "VOUT.n50" "VOUT.n21" 71.6755 +resist "VOUT.n54" "VOUT.n22" 71.6755 +resist "VOUT.n58" "VOUT.n23" 71.6755 +resist "VOUT.n62" "VOUT.n24" 71.6755 +resist "VOUT.n66" "VOUT.n25" 71.6755 +resist "VOUT.n70" "VOUT.n26" 71.6755 +resist "VOUT.n94" "VOUT.n27" 71.6755 +resist "VOUT.n98" "VOUT.n28" 71.6755 +resist "VOUT.n102" "VOUT.n29" 71.6755 +resist "VOUT.n294" "VOUT.n30" 71.6755 +resist "VOUT.n171" "VOUT.n170" 71.6755 +resist "VOUT.n176" "VOUT.n175" 71.6755 +resist "VOUT.n181" "VOUT.n180" 71.6755 +resist "VOUT.n184" "VOUT.n183" 71.6755 +resist "VOUT.n189" "VOUT.n188" 71.6755 +resist "VOUT.n192" "VOUT.n191" 71.6755 +resist "VOUT.n197" "VOUT.n196" 71.6755 +resist "VOUT.n200" "VOUT.n199" 71.6755 +resist "VOUT.n206" "VOUT.n205" 71.6755 +resist "VOUT.n209" "VOUT.n208" 71.6755 +resist "VOUT.n214" "VOUT.n213" 71.6755 +resist "VOUT.n216" "VOUT.n154" 71.6755 +resist "VOUT.n222" "VOUT.n221" 71.6755 +resist "VOUT.n294" "VOUT.n293" 71.6755 +resist "VOUT.n105" "VOUT.n29" 71.6755 +resist "VOUT.n101" "VOUT.n28" 71.6755 +resist "VOUT.n97" "VOUT.n27" 71.6755 +resist "VOUT.n93" "VOUT.n26" 71.6755 +resist "VOUT.n69" "VOUT.n25" 71.6755 +resist "VOUT.n65" "VOUT.n24" 71.6755 +resist "VOUT.n61" "VOUT.n23" 71.6755 +resist "VOUT.n57" "VOUT.n22" 71.6755 +resist "VOUT.n53" "VOUT.n21" 71.6755 +resist "VOUT.n49" "VOUT.n20" 71.6755 +resist "VOUT.n45" "VOUT.n19" 71.6755 +resist "VOUT.n41" "VOUT.n18" 71.6755 +resist "VOUT.n37" "VOUT.n17" 71.6755 +resist "VOUT.n174" "VOUT.n170" 71.6755 +resist "VOUT.n175" "VOUT.n166" 71.6755 +resist "VOUT.n182" "VOUT.n181" 71.6755 +resist "VOUT.n183" "VOUT.n164" 71.6755 +resist "VOUT.n190" "VOUT.n189" 71.6755 +resist "VOUT.n191" "VOUT.n162" 71.6755 +resist "VOUT.n198" "VOUT.n197" 71.6755 +resist "VOUT.n199" "VOUT.n158" 71.6755 +resist "VOUT.n207" "VOUT.n206" 71.6755 +resist "VOUT.n208" "VOUT.n156" 71.6755 +resist "VOUT.n215" "VOUT.n214" 71.6755 +resist "VOUT.n219" "VOUT.n154" 71.6755 +resist "VOUT.n221" "VOUT.n152" 71.6755 +resist "VOUT.n510" "VOUT.n401" 71.6755 +resist "VOUT.n402" "VOUT.n400" 71.6755 +resist "VOUT.n504" "VOUT.n399" 71.6755 +resist "VOUT.n500" "VOUT.n398" 71.6755 +resist "VOUT.n496" "VOUT.n397" 71.6755 +resist "VOUT.n492" "VOUT.n396" 71.6755 +resist "VOUT.n488" "VOUT.n395" 71.6755 +resist "VOUT.n483" "VOUT.n394" 71.6755 +resist "VOUT.n479" "VOUT.n393" 71.6755 +resist "VOUT.n475" "VOUT.n392" 71.6755 +resist "VOUT.n471" "VOUT.n391" 71.6755 +resist "VOUT.n467" "VOUT.n390" 71.6755 +resist "VOUT.n463" "VOUT.n389" 71.6755 +resist "VOUT.n459" "VOUT.n388" 71.6755 +resist "VOUT.n455" "VOUT.n387" 71.6755 +resist "VOUT.n450" "VOUT.n386" 71.6755 +resist "VOUT.n559" "VOUT.n309" 71.6755 +resist "VOUT.n563" "VOUT.n308" 71.6755 +resist "VOUT.n568" "VOUT.n307" 71.6755 +resist "VOUT.n572" "VOUT.n306" 71.6755 +resist "VOUT.n576" "VOUT.n305" 71.6755 +resist "VOUT.n580" "VOUT.n304" 71.6755 +resist "VOUT.n584" "VOUT.n303" 71.6755 +resist "VOUT.n588" "VOUT.n302" 71.6755 +resist "VOUT.n592" "VOUT.n301" 71.6755 +resist "VOUT.n596" "VOUT.n300" 71.6755 +resist "VOUT.n601" "VOUT.n299" 71.6755 +resist "VOUT.n605" "VOUT.n298" 71.6755 +resist "VOUT.n609" "VOUT.n297" 71.6755 +resist "VOUT.n613" "VOUT.n296" 71.6755 +resist "VOUT.n617" "VOUT.n295" 71.6755 +resist "VOUT.n625" "VOUT.n312" 71.6755 +resist "VOUT.n562" "VOUT.n309" 71.6755 +resist "VOUT.n567" "VOUT.n308" 71.6755 +resist "VOUT.n571" "VOUT.n307" 71.6755 +resist "VOUT.n575" "VOUT.n306" 71.6755 +resist "VOUT.n579" "VOUT.n305" 71.6755 +resist "VOUT.n583" "VOUT.n304" 71.6755 +resist "VOUT.n587" "VOUT.n303" 71.6755 +resist "VOUT.n591" "VOUT.n302" 71.6755 +resist "VOUT.n595" "VOUT.n301" 71.6755 +resist "VOUT.n600" "VOUT.n300" 71.6755 +resist "VOUT.n604" "VOUT.n299" 71.6755 +resist "VOUT.n608" "VOUT.n298" 71.6755 +resist "VOUT.n612" "VOUT.n297" 71.6755 +resist "VOUT.n616" "VOUT.n296" 71.6755 +resist "VOUT.n619" "VOUT.n295" 71.6755 +resist "VOUT.n625" "VOUT.n624" 71.6755 +resist "VOUT.n447" "VOUT.n386" 71.6755 +resist "VOUT.n451" "VOUT.n387" 71.6755 +resist "VOUT.n456" "VOUT.n388" 71.6755 +resist "VOUT.n460" "VOUT.n389" 71.6755 +resist "VOUT.n464" "VOUT.n390" 71.6755 +resist "VOUT.n468" "VOUT.n391" 71.6755 +resist "VOUT.n472" "VOUT.n392" 71.6755 +resist "VOUT.n476" "VOUT.n393" 71.6755 +resist "VOUT.n480" "VOUT.n394" 71.6755 +resist "VOUT.n484" "VOUT.n395" 71.6755 +resist "VOUT.n489" "VOUT.n396" 71.6755 +resist "VOUT.n493" "VOUT.n397" 71.6755 +resist "VOUT.n497" "VOUT.n398" 71.6755 +resist "VOUT.n501" "VOUT.n399" 71.6755 +resist "VOUT.n505" "VOUT.n400" 71.6755 +resist "VOUT.n510" "VOUT.n509" 71.6755 +resist "VOUT.t3" "VOUT.n534" 80.8229 +resist "VOUT.n535" "VOUT.t3" 80.8229 +resist "VOUT.t0" "VOUT.n119" 80.8229 +resist "VOUT.n264" "VOUT.t0" 80.8229 +resist "VOUT.n91" "VOUT.n90" 88.0894 +resist "VOUT.n286" "VOUT.t11" 116.385 +resist "VOUT.n237" "VOUT.t25" 116.385 +resist "VOUT.n316" "VOUT.t8" 123.018 +resist "VOUT.n318" "VOUT.t22" 123.018 +resist "VOUT.n408" "VOUT.t20" 123.018 +resist "VOUT.n406" "VOUT.t17" 123.018 +resist "VOUT.t15" "VOUT.n518" 148.714 +resist "VOUT.n331" "VOUT.t7" 148.714 +resist "VOUT.n512" "VOUT.n378" 161.646 +resist "VOUT.n518" "VOUT.n378" 161.646 +resist "VOUT.n520" "VOUT.n519" 161.646 +resist "VOUT.n520" "VOUT.n367" 161.646 +resist "VOUT.n526" "VOUT.n367" 161.646 +resist "VOUT.n527" "VOUT.n526" 161.646 +resist "VOUT.n528" "VOUT.n527" 161.646 +resist "VOUT.n528" "VOUT.n356" 161.646 +resist "VOUT.n534" "VOUT.n356" 161.646 +resist "VOUT.n536" "VOUT.n535" 161.646 +resist "VOUT.n536" "VOUT.n345" 161.646 +resist "VOUT.n542" "VOUT.n345" 161.646 +resist "VOUT.n543" "VOUT.n542" 161.646 +resist "VOUT.n544" "VOUT.n543" 161.646 +resist "VOUT.n544" "VOUT.n326" 161.646 +resist "VOUT.n550" "VOUT.n326" 161.646 +resist "VOUT.n332" "VOUT.n331" 161.646 +resist "VOUT.n332" "VOUT.n310" 161.646 +resist "VOUT.n628" "VOUT.n15" 161.646 +resist "VOUT.n286" "VOUT.n15" 161.646 +resist "VOUT.n285" "VOUT.n284" 161.646 +resist "VOUT.n284" "VOUT.n112" 161.646 +resist "VOUT.n274" "VOUT.n112" 161.646 +resist "VOUT.n274" "VOUT.n273" 161.646 +resist "VOUT.n273" "VOUT.n272" 161.646 +resist "VOUT.n272" "VOUT.n119" 161.646 +resist "VOUT.n264" "VOUT.n125" 161.646 +resist "VOUT.n254" "VOUT.n125" 161.646 +resist "VOUT.n255" "VOUT.n254" 161.646 +resist "VOUT.n255" "VOUT.n133" 161.646 +resist "VOUT.n245" "VOUT.n133" 161.646 +resist "VOUT.n245" "VOUT.n139" 161.646 +resist "VOUT.n237" "VOUT.n145" 161.646 +resist "VOUT.n228" "VOUT.n145" 161.646 +resist "VOUT.n105" "VOUT.n30" 163.366 +resist "VOUT.n102" "VOUT.n101" 163.366 +resist "VOUT.n98" "VOUT.n97" 163.366 +resist "VOUT.n94" "VOUT.n93" 163.366 +resist "VOUT.n70" "VOUT.n69" 163.366 +resist "VOUT.n66" "VOUT.n65" 163.366 +resist "VOUT.n62" "VOUT.n61" 163.366 +resist "VOUT.n58" "VOUT.n57" 163.366 +resist "VOUT.n54" "VOUT.n53" 163.366 +resist "VOUT.n50" "VOUT.n49" 163.366 +resist "VOUT.n46" "VOUT.n45" 163.366 +resist "VOUT.n42" "VOUT.n41" 163.366 +resist "VOUT.n38" "VOUT.n37" 163.366 +resist "VOUT.n171" "VOUT.n150" 163.366 +resist "VOUT.n176" "VOUT.n174" 163.366 +resist "VOUT.n180" "VOUT.n166" 163.366 +resist "VOUT.n184" "VOUT.n182" 163.366 +resist "VOUT.n188" "VOUT.n164" 163.366 +resist "VOUT.n192" "VOUT.n190" 163.366 +resist "VOUT.n196" "VOUT.n162" 163.366 +resist "VOUT.n200" "VOUT.n198" 163.366 +resist "VOUT.n205" "VOUT.n158" 163.366 +resist "VOUT.n209" "VOUT.n207" 163.366 +resist "VOUT.n213" "VOUT.n156" 163.366 +resist "VOUT.n216" "VOUT.n215" 163.366 +resist "VOUT.n220" "VOUT.n219" 163.366 +resist "VOUT.n222" "VOUT.n220" 163.366 +resist "VOUT.n563" "VOUT.n562" 163.366 +resist "VOUT.n568" "VOUT.n567" 163.366 +resist "VOUT.n572" "VOUT.n571" 163.366 +resist "VOUT.n576" "VOUT.n575" 163.366 +resist "VOUT.n580" "VOUT.n579" 163.366 +resist "VOUT.n584" "VOUT.n583" 163.366 +resist "VOUT.n588" "VOUT.n587" 163.366 +resist "VOUT.n592" "VOUT.n591" 163.366 +resist "VOUT.n596" "VOUT.n595" 163.366 +resist "VOUT.n601" "VOUT.n600" 163.366 +resist "VOUT.n605" "VOUT.n604" 163.366 +resist "VOUT.n609" "VOUT.n608" 163.366 +resist "VOUT.n613" "VOUT.n612" 163.366 +resist "VOUT.n617" "VOUT.n616" 163.366 +resist "VOUT.n619" "VOUT.n311" 163.366 +resist "VOUT.n312" "VOUT.n311" 163.366 +resist "VOUT.n451" "VOUT.n450" 163.366 +resist "VOUT.n456" "VOUT.n455" 163.366 +resist "VOUT.n460" "VOUT.n459" 163.366 +resist "VOUT.n464" "VOUT.n463" 163.366 +resist "VOUT.n468" "VOUT.n467" 163.366 +resist "VOUT.n472" "VOUT.n471" 163.366 +resist "VOUT.n476" "VOUT.n475" 163.366 +resist "VOUT.n480" "VOUT.n479" 163.366 +resist "VOUT.n484" "VOUT.n483" 163.366 +resist "VOUT.n489" "VOUT.n488" 163.366 +resist "VOUT.n493" "VOUT.n492" 163.366 +resist "VOUT.n497" "VOUT.n496" 163.366 +resist "VOUT.n501" "VOUT.n500" 163.366 +resist "VOUT.n505" "VOUT.n504" 163.366 +resist "VOUT.n509" "VOUT.n402" 163.366 +resist "VOUT.n401" "VOUT.n384" 163.366 +resist "VOUT.t5" "VOUT.n73" 167.116 +resist "VOUT.t4" "VOUT.n80" 167.116 +resist "VOUT.n315" "VOUT.t9" 175.381 +resist "VOUT.n317" "VOUT.t23" 175.381 +resist "VOUT.n407" "VOUT.t19" 175.381 +resist "VOUT.n405" "VOUT.t16" 175.381 +resist "VOUT.n75" "VOUT.n74" 185 +resist "VOUT.n82" "VOUT.n81" 185 +resist "VOUT.n31" "VOUT.t31" 207.962 +resist "VOUT.n33" "VOUT.t10" 207.962 +resist "VOUT.n159" "VOUT.t28" 207.962 +resist "VOUT.n167" "VOUT.t24" 207.962 +resist "VOUT.n315" "VOUT.t6" 228.009 +resist "VOUT.n317" "VOUT.t21" 228.009 +resist "VOUT.n407" "VOUT.t18" 228.009 +resist "VOUT.n405" "VOUT.t14" 228.009 +resist "VOUT.n32" "VOUT.t33" 233.891 +resist "VOUT.n34" "VOUT.t13" 233.891 +resist "VOUT.n160" "VOUT.t29" 233.891 +resist "VOUT.n168" "VOUT.t26" 233.891 +resist "VOUT.n288" "VOUT.n16" 240.244 +resist "VOUT.n288" "VOUT.n287" 240.244 +resist "VOUT.n287" "VOUT.n110" 240.244 +resist "VOUT.n283" "VOUT.n110" 240.244 +resist "VOUT.n283" "VOUT.n113" 240.244 +resist "VOUT.n275" "VOUT.n113" 240.244 +resist "VOUT.n275" "VOUT.n118" 240.244 +resist "VOUT.n271" "VOUT.n118" 240.244 +resist "VOUT.n271" "VOUT.n120" 240.244 +resist "VOUT.n265" "VOUT.n120" 240.244 +resist "VOUT.n265" "VOUT.n124" 240.244 +resist "VOUT.n253" "VOUT.n124" 240.244 +resist "VOUT.n253" "VOUT.n134" 240.244 +resist "VOUT.n247" "VOUT.n134" 240.244 +resist "VOUT.n247" "VOUT.n246" 240.244 +resist "VOUT.n246" "VOUT.n138" 240.244 +resist "VOUT.n236" "VOUT.n138" 240.244 +resist "VOUT.n236" "VOUT.n146" 240.244 +resist "VOUT.n229" "VOUT.n146" 240.244 +resist "VOUT.n629" "VOUT.n13" 240.244 +resist "VOUT.n13" "VOUT.n10" 240.244 +resist "VOUT.n10" "VOUT.n9" 240.244 +resist "VOUT.n9" "VOUT.n8" 240.244 +resist "VOUT.n111" "VOUT.n8" 240.244 +resist "VOUT.n111" "VOUT.n5" 240.244 +resist "VOUT.n5" "VOUT.n4" 240.244 +resist "VOUT.n4" "VOUT.n3" 240.244 +resist "VOUT.n127" "VOUT.n3" 240.244 +resist "VOUT.n263" "VOUT.n127" 240.244 +resist "VOUT.n263" "VOUT.n126" 240.244 +resist "VOUT.n132" "VOUT.n126" 240.244 +resist "VOUT.n256" "VOUT.n132" 240.244 +resist "VOUT.n256" "VOUT.n131" 240.244 +resist "VOUT.n244" "VOUT.n131" 240.244 +resist "VOUT.n244" "VOUT.n140" 240.244 +resist "VOUT.n238" "VOUT.n140" 240.244 +resist "VOUT.n238" "VOUT.n144" 240.244 +resist "VOUT.n227" "VOUT.n144" 240.244 +resist "VOUT.n443" "VOUT.n385" 240.244 +resist "VOUT.n443" "VOUT.n377" 240.244 +resist "VOUT.n377" "VOUT.n376" 240.244 +resist "VOUT.n376" "VOUT.n375" 240.244 +resist "VOUT.n436" "VOUT.n375" 240.244 +resist "VOUT.n436" "VOUT.n366" 240.244 +resist "VOUT.n366" "VOUT.n365" 240.244 +resist "VOUT.n365" "VOUT.n364" 240.244 +resist "VOUT.n429" "VOUT.n364" 240.244 +resist "VOUT.n429" "VOUT.n355" 240.244 +resist "VOUT.n355" "VOUT.n354" 240.244 +resist "VOUT.n354" "VOUT.n353" 240.244 +resist "VOUT.n422" "VOUT.n353" 240.244 +resist "VOUT.n422" "VOUT.n344" 240.244 +resist "VOUT.n344" "VOUT.n343" 240.244 +resist "VOUT.n343" "VOUT.n342" 240.244 +resist "VOUT.n342" "VOUT.n325" 240.244 +resist "VOUT.n551" "VOUT.n325" 240.244 +resist "VOUT.n551" "VOUT.n324" 240.244 +resist "VOUT.n324" "VOUT.n320" 240.244 +resist "VOUT.n558" "VOUT.n320" 240.244 +resist "VOUT.n513" "VOUT.n379" 240.244 +resist "VOUT.n517" "VOUT.n379" 240.244 +resist "VOUT.n517" "VOUT.n374" 240.244 +resist "VOUT.n521" "VOUT.n374" 240.244 +resist "VOUT.n521" "VOUT.n368" 240.244 +resist "VOUT.n525" "VOUT.n368" 240.244 +resist "VOUT.n525" "VOUT.n363" 240.244 +resist "VOUT.n529" "VOUT.n363" 240.244 +resist "VOUT.n529" "VOUT.n357" 240.244 +resist "VOUT.n533" "VOUT.n357" 240.244 +resist "VOUT.n533" "VOUT.n352" 240.244 +resist "VOUT.n537" "VOUT.n352" 240.244 +resist "VOUT.n537" "VOUT.n346" 240.244 +resist "VOUT.n541" "VOUT.n346" 240.244 +resist "VOUT.n541" "VOUT.n341" 240.244 +resist "VOUT.n545" "VOUT.n341" 240.244 +resist "VOUT.n545" "VOUT.n328" 240.244 +resist "VOUT.n549" "VOUT.n328" 240.244 +resist "VOUT.n549" "VOUT.n327" 240.244 +resist "VOUT.n333" "VOUT.n327" 240.244 +resist "VOUT.n333" "VOUT.n313" 240.244 +resist "VOUT.n90" "VOUT.t35" 249.88 +resist "VOUT.n627" "VOUT.n17" 256.663 +resist "VOUT.n627" "VOUT.n18" 256.663 +resist "VOUT.n627" "VOUT.n19" 256.663 +resist "VOUT.n627" "VOUT.n20" 256.663 +resist "VOUT.n627" "VOUT.n21" 256.663 +resist "VOUT.n627" "VOUT.n22" 256.663 +resist "VOUT.n627" "VOUT.n23" 256.663 +resist "VOUT.n627" "VOUT.n24" 256.663 +resist "VOUT.n627" "VOUT.n25" 256.663 +resist "VOUT.n627" "VOUT.n26" 256.663 +resist "VOUT.n627" "VOUT.n27" 256.663 +resist "VOUT.n627" "VOUT.n28" 256.663 +resist "VOUT.n627" "VOUT.n29" 256.663 +resist "VOUT.n627" "VOUT.n294" 256.663 +resist "VOUT.n170" "VOUT.n151" 256.663 +resist "VOUT.n175" "VOUT.n151" 256.663 +resist "VOUT.n181" "VOUT.n151" 256.663 +resist "VOUT.n183" "VOUT.n151" 256.663 +resist "VOUT.n189" "VOUT.n151" 256.663 +resist "VOUT.n191" "VOUT.n151" 256.663 +resist "VOUT.n197" "VOUT.n151" 256.663 +resist "VOUT.n199" "VOUT.n151" 256.663 +resist "VOUT.n206" "VOUT.n151" 256.663 +resist "VOUT.n208" "VOUT.n151" 256.663 +resist "VOUT.n214" "VOUT.n151" 256.663 +resist "VOUT.n154" "VOUT.n151" 256.663 +resist "VOUT.n221" "VOUT.n151" 256.663 +resist "VOUT.n511" "VOUT.n510" 256.663 +resist "VOUT.n511" "VOUT.n400" 256.663 +resist "VOUT.n511" "VOUT.n399" 256.663 +resist "VOUT.n511" "VOUT.n398" 256.663 +resist "VOUT.n511" "VOUT.n397" 256.663 +resist "VOUT.n511" "VOUT.n396" 256.663 +resist "VOUT.n511" "VOUT.n395" 256.663 +resist "VOUT.n511" "VOUT.n394" 256.663 +resist "VOUT.n511" "VOUT.n393" 256.663 +resist "VOUT.n511" "VOUT.n392" 256.663 +resist "VOUT.n511" "VOUT.n391" 256.663 +resist "VOUT.n511" "VOUT.n390" 256.663 +resist "VOUT.n511" "VOUT.n389" 256.663 +resist "VOUT.n511" "VOUT.n388" 256.663 +resist "VOUT.n511" "VOUT.n387" 256.663 +resist "VOUT.n511" "VOUT.n386" 256.663 +resist "VOUT.n626" "VOUT.n309" 256.663 +resist "VOUT.n626" "VOUT.n308" 256.663 +resist "VOUT.n626" "VOUT.n307" 256.663 +resist "VOUT.n626" "VOUT.n306" 256.663 +resist "VOUT.n626" "VOUT.n305" 256.663 +resist "VOUT.n626" "VOUT.n304" 256.663 +resist "VOUT.n626" "VOUT.n303" 256.663 +resist "VOUT.n626" "VOUT.n302" 256.663 +resist "VOUT.n626" "VOUT.n301" 256.663 +resist "VOUT.n626" "VOUT.n300" 256.663 +resist "VOUT.n626" "VOUT.n299" 256.663 +resist "VOUT.n626" "VOUT.n298" 256.663 +resist "VOUT.n626" "VOUT.n297" 256.663 +resist "VOUT.n626" "VOUT.n296" 256.663 +resist "VOUT.n626" "VOUT.n295" 256.663 +resist "VOUT.n626" "VOUT.n625" 256.663 +resist "VOUT.n89" "VOUT.t2" 264.649 +resist "VOUT.n31" "VOUT.t32" 278.497 +resist "VOUT.n33" "VOUT.t12" 278.497 +resist "VOUT.n159" "VOUT.t30" 278.497 +resist "VOUT.n167" "VOUT.t27" 278.497 +resist "VOUT.n628" "VOUT.n627" 284.497 +resist "VOUT.n228" "VOUT.n151" 284.497 +resist "VOUT.n74" "VOUT.n72" 289.615 +resist "VOUT.n81" "VOUT.n79" 289.615 +resist "VOUT.n627" "VOUT.n626" 300.661 +resist "VOUT.n88" "VOUT.t34" 302.261 +resist "VOUT.n88" "VOUT.t1" 304.466 +resist "VOUT.n512" "VOUT.n511" 316.826 +resist "VOUT.n626" "VOUT.n310" 316.826 +resist "VOUT.n14" "VOUT.n12" 585 +resist "VOUT.n37" "VOUT.n36" 585 +resist "VOUT.n39" "VOUT.n38" 585 +resist "VOUT.n41" "VOUT.n40" 585 +resist "VOUT.n43" "VOUT.n42" 585 +resist "VOUT.n45" "VOUT.n44" 585 +resist "VOUT.n47" "VOUT.n46" 585 +resist "VOUT.n49" "VOUT.n48" 585 +resist "VOUT.n51" "VOUT.n50" 585 +resist "VOUT.n53" "VOUT.n52" 585 +resist "VOUT.n55" "VOUT.n54" 585 +resist "VOUT.n57" "VOUT.n56" 585 +resist "VOUT.n59" "VOUT.n58" 585 +resist "VOUT.n61" "VOUT.n60" 585 +resist "VOUT.n63" "VOUT.n62" 585 +resist "VOUT.n65" "VOUT.n64" 585 +resist "VOUT.n67" "VOUT.n66" 585 +resist "VOUT.n69" "VOUT.n68" 585 +resist "VOUT.n71" "VOUT.n70" 585 +resist "VOUT.n93" "VOUT.n92" 585 +resist "VOUT.n95" "VOUT.n94" 585 +resist "VOUT.n97" "VOUT.n96" 585 +resist "VOUT.n99" "VOUT.n98" 585 +resist "VOUT.n101" "VOUT.n100" 585 +resist "VOUT.n103" "VOUT.n102" 585 +resist "VOUT.n106" "VOUT.n105" 585 +resist "VOUT.n107" "VOUT.n30" 585 +resist "VOUT.n293" "VOUT.n292" 585 +resist "VOUT.n151" "VOUT.n150" 585 +resist "VOUT.n150" "VOUT.n149" 585 +resist "VOUT.n172" "VOUT.n171" 585 +resist "VOUT.n174" "VOUT.n173" 585 +resist "VOUT.n177" "VOUT.n176" 585 +resist "VOUT.n178" "VOUT.n166" 585 +resist "VOUT.n180" "VOUT.n179" 585 +resist "VOUT.n182" "VOUT.n165" 585 +resist "VOUT.n185" "VOUT.n184" 585 +resist "VOUT.n186" "VOUT.n164" 585 +resist "VOUT.n188" "VOUT.n187" 585 +resist "VOUT.n190" "VOUT.n163" 585 +resist "VOUT.n193" "VOUT.n192" 585 +resist "VOUT.n194" "VOUT.n162" 585 +resist "VOUT.n196" "VOUT.n195" 585 +resist "VOUT.n198" "VOUT.n161" 585 +resist "VOUT.n201" "VOUT.n200" 585 +resist "VOUT.n203" "VOUT.n158" 585 +resist "VOUT.n205" "VOUT.n204" 585 +resist "VOUT.n207" "VOUT.n157" 585 +resist "VOUT.n210" "VOUT.n209" 585 +resist "VOUT.n211" "VOUT.n156" 585 +resist "VOUT.n213" "VOUT.n212" 585 +resist "VOUT.n215" "VOUT.n155" 585 +resist "VOUT.n217" "VOUT.n216" 585 +resist "VOUT.n219" "VOUT.n218" 585 +resist "VOUT.n220" "VOUT.n151" 585 +resist "VOUT.n220" "VOUT.n153" 585 +resist "VOUT.n223" "VOUT.n222" 585 +resist "VOUT.n224" "VOUT.n152" 585 +resist "VOUT.n229" "VOUT.n228" 585 +resist "VOUT.n230" "VOUT.n229" 585 +resist "VOUT.n146" "VOUT.n145" 585 +resist "VOUT.n147" "VOUT.n146" 585 +resist "VOUT.n237" "VOUT.n236" 585 +resist "VOUT.n236" "VOUT.n235" 585 +resist "VOUT.n139" "VOUT.n138" 585 +resist "VOUT.n148" "VOUT.n138" 585 +resist "VOUT.n246" "VOUT.n245" 585 +resist "VOUT.n246" "VOUT.n137" 585 +resist "VOUT.n247" "VOUT.n133" 585 +resist "VOUT.n248" "VOUT.n247" 585 +resist "VOUT.n255" "VOUT.n134" 585 +resist "VOUT.n135" "VOUT.n134" 585 +resist "VOUT.n254" "VOUT.n253" 585 +resist "VOUT.n253" "VOUT.n252" 585 +resist "VOUT.n125" "VOUT.n124" 585 +resist "VOUT.n124" "VOUT.n123" 585 +resist "VOUT.n265" "VOUT.n264" 585 +resist "VOUT.n266" "VOUT.n265" 585 +resist "VOUT.n120" "VOUT.n119" 585 +resist "VOUT.n121" "VOUT.n120" 585 +resist "VOUT.n272" "VOUT.n271" 585 +resist "VOUT.n271" "VOUT.n270" 585 +resist "VOUT.n273" "VOUT.n118" 585 +resist "VOUT.n118" "VOUT.n117" 585 +resist "VOUT.n275" "VOUT.n274" 585 +resist "VOUT.n276" "VOUT.n275" 585 +resist "VOUT.n113" "VOUT.n112" 585 +resist "VOUT.n114" "VOUT.n113" 585 +resist "VOUT.n284" "VOUT.n283" 585 +resist "VOUT.n283" "VOUT.n282" 585 +resist "VOUT.n285" "VOUT.n110" 585 +resist "VOUT.n115" "VOUT.n110" 585 +resist "VOUT.n287" "VOUT.n286" 585 +resist "VOUT.n287" "VOUT.n109" 585 +resist "VOUT.n288" "VOUT.n15" 585 +resist "VOUT.n289" "VOUT.n288" 585 +resist "VOUT.n628" "VOUT.n16" 585 +resist "VOUT.n290" "VOUT.n16" 585 +resist "VOUT.n228" "VOUT.n227" 585 +resist "VOUT.n227" "VOUT.n226" 585 +resist "VOUT.n145" "VOUT.n144" 585 +resist "VOUT.n144" "VOUT.n143" 585 +resist "VOUT.n238" "VOUT.n237" 585 +resist "VOUT.n239" "VOUT.n238" 585 +resist "VOUT.n140" "VOUT.n139" 585 +resist "VOUT.n141" "VOUT.n140" 585 +resist "VOUT.n245" "VOUT.n244" 585 +resist "VOUT.n244" "VOUT.n243" 585 +resist "VOUT.n133" "VOUT.n131" 585 +resist "VOUT.n131" "VOUT.n130" 585 +resist "VOUT.n256" "VOUT.n255" 585 +resist "VOUT.n257" "VOUT.n256" 585 +resist "VOUT.n254" "VOUT.n132" 585 +resist "VOUT.n132" "VOUT.n128" 585 +resist "VOUT.n126" "VOUT.n125" 585 +resist "VOUT.n261" "VOUT.n126" 585 +resist "VOUT.n264" "VOUT.n263" 585 +resist "VOUT.n263" "VOUT.n262" 585 +resist "VOUT.n127" "VOUT.n119" 585 +resist "VOUT.n127" "VOUT.n1" 585 +resist "VOUT.n272" "VOUT.n3" 585 +resist "VOUT.n642" "VOUT.n3" 585 +resist "VOUT.n273" "VOUT.n4" 585 +resist "VOUT.n641" "VOUT.n4" 585 +resist "VOUT.n274" "VOUT.n5" 585 +resist "VOUT.n640" "VOUT.n5" 585 +resist "VOUT.n112" "VOUT.n111" 585 +resist "VOUT.n111" "VOUT.n6" 585 +resist "VOUT.n284" "VOUT.n8" 585 +resist "VOUT.n636" "VOUT.n8" 585 +resist "VOUT.n285" "VOUT.n9" 585 +resist "VOUT.n635" "VOUT.n9" 585 +resist "VOUT.n286" "VOUT.n10" 585 +resist "VOUT.n634" "VOUT.n10" 585 +resist "VOUT.n15" "VOUT.n13" 585 +resist "VOUT.n13" "VOUT.n11" 585 +resist "VOUT.n629" "VOUT.n628" 585 +resist "VOUT.n630" "VOUT.n629" 585 +resist "VOUT.n513" "VOUT.n512" 585 +resist "VOUT.n514" "VOUT.n513" 585 +resist "VOUT.n379" "VOUT.n378" 585 +resist "VOUT.n515" "VOUT.n379" 585 +resist "VOUT.n518" "VOUT.n517" 585 +resist "VOUT.n517" "VOUT.n516" 585 +resist "VOUT.n519" "VOUT.n374" 585 +resist "VOUT.n374" "VOUT.n373" 585 +resist "VOUT.n521" "VOUT.n520" 585 +resist "VOUT.n522" "VOUT.n521" 585 +resist "VOUT.n368" "VOUT.n367" 585 +resist "VOUT.n523" "VOUT.n368" 585 +resist "VOUT.n526" "VOUT.n525" 585 +resist "VOUT.n525" "VOUT.n524" 585 +resist "VOUT.n527" "VOUT.n363" 585 +resist "VOUT.n363" "VOUT.n362" 585 +resist "VOUT.n529" "VOUT.n528" 585 +resist "VOUT.n530" "VOUT.n529" 585 +resist "VOUT.n357" "VOUT.n356" 585 +resist "VOUT.n531" "VOUT.n357" 585 +resist "VOUT.n534" "VOUT.n533" 585 +resist "VOUT.n533" "VOUT.n532" 585 +resist "VOUT.n535" "VOUT.n352" 585 +resist "VOUT.n352" "VOUT.n351" 585 +resist "VOUT.n537" "VOUT.n536" 585 +resist "VOUT.n538" "VOUT.n537" 585 +resist "VOUT.n346" "VOUT.n345" 585 +resist "VOUT.n539" "VOUT.n346" 585 +resist "VOUT.n542" "VOUT.n541" 585 +resist "VOUT.n541" "VOUT.n540" 585 +resist "VOUT.n543" "VOUT.n341" 585 +resist "VOUT.n341" "VOUT.n340" 585 +resist "VOUT.n545" "VOUT.n544" 585 +resist "VOUT.n546" "VOUT.n545" 585 +resist "VOUT.n328" "VOUT.n326" 585 +resist "VOUT.n547" "VOUT.n328" 585 +resist "VOUT.n550" "VOUT.n549" 585 +resist "VOUT.n549" "VOUT.n548" 585 +resist "VOUT.n331" "VOUT.n327" 585 +resist "VOUT.n329" "VOUT.n327" 585 +resist "VOUT.n333" "VOUT.n332" 585 +resist "VOUT.n334" "VOUT.n333" 585 +resist "VOUT.n313" "VOUT.n310" 585 +resist "VOUT.n330" "VOUT.n313" 585 +resist "VOUT.n558" "VOUT.n310" 585 +resist "VOUT.n558" "VOUT.n557" 585 +resist "VOUT.n332" "VOUT.n320" 585 +resist "VOUT.n556" "VOUT.n320" 585 +resist "VOUT.n331" "VOUT.n324" 585 +resist "VOUT.n324" "VOUT.n321" 585 +resist "VOUT.n551" "VOUT.n550" 585 +resist "VOUT.n552" "VOUT.n551" 585 +resist "VOUT.n326" "VOUT.n325" 585 +resist "VOUT.n325" "VOUT.n323" 585 +resist "VOUT.n544" "VOUT.n342" 585 +resist "VOUT.n417" "VOUT.n342" 585 +resist "VOUT.n543" "VOUT.n343" 585 +resist "VOUT.n416" "VOUT.n343" 585 +resist "VOUT.n542" "VOUT.n344" 585 +resist "VOUT.n421" "VOUT.n344" 585 +resist "VOUT.n422" "VOUT.n345" 585 +resist "VOUT.n423" "VOUT.n422" 585 +resist "VOUT.n536" "VOUT.n353" 585 +resist "VOUT.n424" "VOUT.n353" 585 +resist "VOUT.n535" "VOUT.n354" 585 +resist "VOUT.n414" "VOUT.n354" 585 +resist "VOUT.n534" "VOUT.n355" 585 +resist "VOUT.n428" "VOUT.n355" 585 +resist "VOUT.n429" "VOUT.n356" 585 +resist "VOUT.n430" "VOUT.n429" 585 +resist "VOUT.n528" "VOUT.n364" 585 +resist "VOUT.n431" "VOUT.n364" 585 +resist "VOUT.n527" "VOUT.n365" 585 +resist "VOUT.n412" "VOUT.n365" 585 +resist "VOUT.n526" "VOUT.n366" 585 +resist "VOUT.n435" "VOUT.n366" 585 +resist "VOUT.n436" "VOUT.n367" 585 +resist "VOUT.n437" "VOUT.n436" 585 +resist "VOUT.n520" "VOUT.n375" 585 +resist "VOUT.n438" "VOUT.n375" 585 +resist "VOUT.n519" "VOUT.n376" 585 +resist "VOUT.n410" "VOUT.n376" 585 +resist "VOUT.n518" "VOUT.n377" 585 +resist "VOUT.n442" "VOUT.n377" 585 +resist "VOUT.n443" "VOUT.n378" 585 +resist "VOUT.n444" "VOUT.n443" 585 +resist "VOUT.n512" "VOUT.n385" 585 +resist "VOUT.n445" "VOUT.n385" 585 +resist "VOUT.n511" "VOUT.n384" 585 +resist "VOUT.n403" "VOUT.n384" 585 +resist "VOUT.n404" "VOUT.n401" 585 +resist "VOUT.n509" "VOUT.n508" 585 +resist "VOUT.n507" "VOUT.n402" 585 +resist "VOUT.n506" "VOUT.n505" 585 +resist "VOUT.n504" "VOUT.n503" 585 +resist "VOUT.n502" "VOUT.n501" 585 +resist "VOUT.n500" "VOUT.n499" 585 +resist "VOUT.n498" "VOUT.n497" 585 +resist "VOUT.n496" "VOUT.n495" 585 +resist "VOUT.n494" "VOUT.n493" 585 +resist "VOUT.n492" "VOUT.n491" 585 +resist "VOUT.n490" "VOUT.n489" 585 +resist "VOUT.n488" "VOUT.n487" 585 +resist "VOUT.n485" "VOUT.n484" 585 +resist "VOUT.n483" "VOUT.n482" 585 +resist "VOUT.n481" "VOUT.n480" 585 +resist "VOUT.n479" "VOUT.n478" 585 +resist "VOUT.n477" "VOUT.n476" 585 +resist "VOUT.n475" "VOUT.n474" 585 +resist "VOUT.n473" "VOUT.n472" 585 +resist "VOUT.n471" "VOUT.n470" 585 +resist "VOUT.n469" "VOUT.n468" 585 +resist "VOUT.n467" "VOUT.n466" 585 +resist "VOUT.n465" "VOUT.n464" 585 +resist "VOUT.n463" "VOUT.n462" 585 +resist "VOUT.n461" "VOUT.n460" 585 +resist "VOUT.n459" "VOUT.n458" 585 +resist "VOUT.n457" "VOUT.n456" 585 +resist "VOUT.n455" "VOUT.n454" 585 +resist "VOUT.n452" "VOUT.n451" 585 +resist "VOUT.n450" "VOUT.n449" 585 +resist "VOUT.n448" "VOUT.n447" 585 +resist "VOUT.n560" "VOUT.n559" 585 +resist "VOUT.n562" "VOUT.n561" 585 +resist "VOUT.n564" "VOUT.n563" 585 +resist "VOUT.n567" "VOUT.n566" 585 +resist "VOUT.n569" "VOUT.n568" 585 +resist "VOUT.n571" "VOUT.n570" 585 +resist "VOUT.n573" "VOUT.n572" 585 +resist "VOUT.n575" "VOUT.n574" 585 +resist "VOUT.n577" "VOUT.n576" 585 +resist "VOUT.n579" "VOUT.n578" 585 +resist "VOUT.n581" "VOUT.n580" 585 +resist "VOUT.n583" "VOUT.n582" 585 +resist "VOUT.n585" "VOUT.n584" 585 +resist "VOUT.n587" "VOUT.n586" 585 +resist "VOUT.n589" "VOUT.n588" 585 +resist "VOUT.n591" "VOUT.n590" 585 +resist "VOUT.n593" "VOUT.n592" 585 +resist "VOUT.n595" "VOUT.n594" 585 +resist "VOUT.n597" "VOUT.n596" 585 +resist "VOUT.n600" "VOUT.n599" 585 +resist "VOUT.n602" "VOUT.n601" 585 +resist "VOUT.n604" "VOUT.n603" 585 +resist "VOUT.n606" "VOUT.n605" 585 +resist "VOUT.n608" "VOUT.n607" 585 +resist "VOUT.n610" "VOUT.n609" 585 +resist "VOUT.n612" "VOUT.n611" 585 +resist "VOUT.n614" "VOUT.n613" 585 +resist "VOUT.n616" "VOUT.n615" 585 +resist "VOUT.n618" "VOUT.n617" 585 +resist "VOUT.n620" "VOUT.n619" 585 +resist "VOUT.n626" "VOUT.n311" 585 +resist "VOUT.n621" "VOUT.n311" 585 +resist "VOUT.n622" "VOUT.n312" 585 +resist "VOUT.n624" "VOUT.n623" 585 +resist "VOUT.n293" "VOUT.n16" 591 +resist "VOUT.n629" "VOUT.n14" 591 +resist "VOUT.n229" "VOUT.n150" 591 +resist "VOUT.n227" "VOUT.n152" 591 +resist "VOUT.n559" "VOUT.n558" 711.122 +resist "VOUT.n447" "VOUT.n385" 711.122 +resist "VOUT.n513" "VOUT.n384" 711.122 +resist "VOUT.n624" "VOUT.n313" 711.122 +device msubckt sky130_fd_pr__nfet_01v8 521 248 522 249 "VOUT.t7" "VOUT.t6" 948 0 "VOUT.t8" 400 0 "VOUT.t9" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 2361 -664 2362 -663 "VOUT.t0" "Ib.t3" 788 0 "VOUT.t34" 200 0 "VOUT.t35" 200 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 1683 248 1684 249 "VOUT.t11" "VOUT.t10" 788 0 "VOUT.t12" 200 0 "VOUT.t13" 200 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 -237 248 -236 249 "VOUT.t3" "VIN.t1" 948 0 "VOUT.t5" 400 31200,956 "Ib.t1" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -995 248 -994 249 "VOUT.t15" "VOUT.t14" 948 0 "VOUT.t16" 400 0 "VOUT.t17" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -995 -864 -994 -863 "VOUT.t15" "VOUT.t18" 948 0 "VOUT.t19" 400 0 "VOUT.t20" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 -237 -864 -236 -863 "VOUT.t3" "VIN.t0" 948 0 "VOUT.t4" 400 31200,956 "Ib.t0" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 521 -864 522 -863 "VOUT.t7" "VOUT.t21" 948 0 "VOUT.t22" 400 0 "VOUT.t23" 400 31200,956 +device msubckt sky130_fd_pr__nfet_01v8 2361 248 2362 249 "VOUT.t0" "Ib.t2" 788 0 "VOUT.t1" 200 0 "VOUT.t2" 200 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 3039 -664 3040 -663 "VOUT.t25" "VOUT.t24" 788 0 "VOUT.t26" 200 0 "VOUT.t27" 200 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 3039 248 3040 249 "VOUT.t25" "VOUT.t28" 788 0 "VOUT.t29" 200 0 "VOUT.t30" 200 15600,556 +device msubckt sky130_fd_pr__nfet_01v8 1683 -664 1684 -663 "VOUT.t11" "VOUT.t31" 788 0 "VOUT.t32" 200 0 "VOUT.t33" 200 15600,556 diff --git a/src/glayout/blocks/elementary/FVF/fvf.sim b/src/glayout/blocks/elementary/FVF/fvf.sim new file mode 100644 index 00000000..3d936658 --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf.sim @@ -0,0 +1,19 @@ +| units: 500000 tech: sky130A format: MIT +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=-663 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=248 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=-663 sky130_fd_pr__nfet_01v8 +x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=248 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=-863 sky130_fd_pr__nfet_01v8 +x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=-863 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=-863 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=248 sky130_fd_pr__nfet_01v8 +x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=248 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=248 sky130_fd_pr__nfet_01v8 +x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=-663 sky130_fd_pr__nfet_01v8 +x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=248 sky130_fd_pr__nfet_01v8 +C Ib0 11.7 +R Ib 2390 +C VIN0 3.9 +R VIN 679 +R VOUT 67459 += VOUT VBULK diff --git a/src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt b/src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt new file mode 100644 index 00000000..f437979a --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt @@ -0,0 +1,21 @@ +fvf count: +---------------------------------------- +Metal2 spacing < 0.14um (met2.2) +---------------------------------------- + 10.245um -0.895um 10.300um -0.755um + 10.245um -0.895um 10.300um -0.720um + 10.245um -0.720um 10.300um -0.460um + 10.245um -0.460um 10.300um 0.000um + 10.105um -0.460um 10.160um 0.000um + 10.105um -0.720um 10.125um -0.460um + 10.125um -0.720um 10.160um -0.460um + 10.105um -0.755um 10.160um -0.720um + 10.245um 0.000um 10.300um 1.975um + 10.105um 0.000um 10.160um 1.975um +---------------------------------------- +Via1 width < 0.26um (via.1a + 2 * via.4a) +---------------------------------------- + 14.460um -4.050um 14.645um -4.005um + 14.460um -4.055um 14.645um -4.050um +---------------------------------------- + diff --git a/src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt b/src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt new file mode 100644 index 00000000..0c537f19 --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt @@ -0,0 +1,58 @@ + +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 NMOS in circuit fvf (1)(2 instances) +Flattening unmatched subcell NMOS_1 in circuit fvf (1)(2 instances) + +Cell fvf (0) disconnected node: VBULK +Class fvf (0): Merged 9 parallel devices. +Class fvf (1): Merged 9 parallel devices. +Cell fvf (0) disconnected node: VBULK +Subcircuit summary: +Circuit 1: fvf |Circuit 2: fvf +-------------------------------------------|------------------------------------------- +sky130_fd_pr__nfet_01v8 (12->3) |sky130_fd_pr__nfet_01v8 (24->3) +Number of devices: 3 |Number of devices: 3 +Number of nets: 3 **Mismatch** |Number of nets: 4 **Mismatch** +--------------------------------------------------------------------------------------- +NET mismatches: Class fragments follow (with fanout counts): +Circuit 1: fvf |Circuit 2: fvf + +--------------------------------------------------------------------------------------- +Net: VOUT |Net: VOUT + sky130_fd_pr__nfet_01v8/(1|3) = 5 | sky130_fd_pr__nfet_01v8/(1|3) = 2 + sky130_fd_pr__nfet_01v8/2 = 1 | + sky130_fd_pr__nfet_01v8/4 = 3 | + | +(no matching net) |Net: VBULK + | sky130_fd_pr__nfet_01v8/4 = 3 + | sky130_fd_pr__nfet_01v8/(1|3) = 3 + | sky130_fd_pr__nfet_01v8/2 = 1 +--------------------------------------------------------------------------------------- +Netlists do not match. + +Subcircuit pins: +Circuit 1: fvf |Circuit 2: fvf +-------------------------------------------|------------------------------------------- +VOUT |VOUT +Ib |Ib +VIN |VIN +(no matching pin) |VBULK +VBULK |(no matching pin) +--------------------------------------------------------------------------------------- +Cell pin lists for fvf and fvf altered to match. +Device classes fvf and fvf are equivalent. + +Final result: Top level cell failed pin matching. diff --git a/src/glayout/blocks/elementary/FVF/fvf_pex.spice b/src/glayout/blocks/elementary/FVF/fvf_pex.spice new file mode 100644 index 00000000..4ba5c6cc --- /dev/null +++ b/src/glayout/blocks/elementary/FVF/fvf_pex.spice @@ -0,0 +1,1173 @@ +* NGSPICE file created from fvf.ext - technology: sky130A + +.subckt fvf VBULK VIN VOUT Ib +X0 VOUT.t33 VOUT.t31 VOUT.t32 VOUT.t11 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 +X1 VOUT.t30 VOUT.t28 VOUT.t29 VOUT.t25 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 +X2 VOUT.t27 VOUT.t24 VOUT.t26 VOUT.t25 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 +X3 VOUT.t2 Ib.t2 VOUT.t1 VOUT.t0 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 +X4 VOUT.t23 VOUT.t21 VOUT.t22 VOUT.t7 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 +X5 Ib.t0 VIN.t0 VOUT.t4 VOUT.t3 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0.78 ps=4.78 w=2 l=2.37 +X6 VOUT.t20 VOUT.t18 VOUT.t19 VOUT.t15 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 +X7 VOUT.t17 VOUT.t14 VOUT.t16 VOUT.t15 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 +X8 Ib.t1 VIN.t1 VOUT.t5 VOUT.t3 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0.78 ps=4.78 w=2 l=2.37 +X9 VOUT.t13 VOUT.t10 VOUT.t12 VOUT.t11 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 +X10 VOUT.t35 Ib.t3 VOUT.t34 VOUT.t0 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 +X11 VOUT.t9 VOUT.t6 VOUT.t8 VOUT.t7 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 +R0 VOUT.n624 VOUT.n313 711.122 +R1 VOUT.n513 VOUT.n384 711.122 +R2 VOUT.n447 VOUT.n385 711.122 +R3 VOUT.n559 VOUT.n558 711.122 +R4 VOUT.n227 VOUT.n152 591 +R5 VOUT.n229 VOUT.n150 591 +R6 VOUT.n629 VOUT.n14 591 +R7 VOUT.n293 VOUT.n16 591 +R8 VOUT.n624 VOUT.n623 585 +R9 VOUT.n622 VOUT.n312 585 +R10 VOUT.n621 VOUT.n311 585 +R11 VOUT.n626 VOUT.n311 585 +R12 VOUT.n620 VOUT.n619 585 +R13 VOUT.n618 VOUT.n617 585 +R14 VOUT.n616 VOUT.n615 585 +R15 VOUT.n614 VOUT.n613 585 +R16 VOUT.n612 VOUT.n611 585 +R17 VOUT.n610 VOUT.n609 585 +R18 VOUT.n608 VOUT.n607 585 +R19 VOUT.n606 VOUT.n605 585 +R20 VOUT.n604 VOUT.n603 585 +R21 VOUT.n602 VOUT.n601 585 +R22 VOUT.n600 VOUT.n599 585 +R23 VOUT.n597 VOUT.n596 585 +R24 VOUT.n595 VOUT.n594 585 +R25 VOUT.n593 VOUT.n592 585 +R26 VOUT.n591 VOUT.n590 585 +R27 VOUT.n589 VOUT.n588 585 +R28 VOUT.n587 VOUT.n586 585 +R29 VOUT.n585 VOUT.n584 585 +R30 VOUT.n583 VOUT.n582 585 +R31 VOUT.n581 VOUT.n580 585 +R32 VOUT.n579 VOUT.n578 585 +R33 VOUT.n577 VOUT.n576 585 +R34 VOUT.n575 VOUT.n574 585 +R35 VOUT.n573 VOUT.n572 585 +R36 VOUT.n571 VOUT.n570 585 +R37 VOUT.n569 VOUT.n568 585 +R38 VOUT.n567 VOUT.n566 585 +R39 VOUT.n564 VOUT.n563 585 +R40 VOUT.n562 VOUT.n561 585 +R41 VOUT.n560 VOUT.n559 585 +R42 VOUT.n448 VOUT.n447 585 +R43 VOUT.n450 VOUT.n449 585 +R44 VOUT.n452 VOUT.n451 585 +R45 VOUT.n455 VOUT.n454 585 +R46 VOUT.n457 VOUT.n456 585 +R47 VOUT.n459 VOUT.n458 585 +R48 VOUT.n461 VOUT.n460 585 +R49 VOUT.n463 VOUT.n462 585 +R50 VOUT.n465 VOUT.n464 585 +R51 VOUT.n467 VOUT.n466 585 +R52 VOUT.n469 VOUT.n468 585 +R53 VOUT.n471 VOUT.n470 585 +R54 VOUT.n473 VOUT.n472 585 +R55 VOUT.n475 VOUT.n474 585 +R56 VOUT.n477 VOUT.n476 585 +R57 VOUT.n479 VOUT.n478 585 +R58 VOUT.n481 VOUT.n480 585 +R59 VOUT.n483 VOUT.n482 585 +R60 VOUT.n485 VOUT.n484 585 +R61 VOUT.n488 VOUT.n487 585 +R62 VOUT.n490 VOUT.n489 585 +R63 VOUT.n492 VOUT.n491 585 +R64 VOUT.n494 VOUT.n493 585 +R65 VOUT.n496 VOUT.n495 585 +R66 VOUT.n498 VOUT.n497 585 +R67 VOUT.n500 VOUT.n499 585 +R68 VOUT.n502 VOUT.n501 585 +R69 VOUT.n504 VOUT.n503 585 +R70 VOUT.n506 VOUT.n505 585 +R71 VOUT.n507 VOUT.n402 585 +R72 VOUT.n509 VOUT.n508 585 +R73 VOUT.n404 VOUT.n401 585 +R74 VOUT.n403 VOUT.n384 585 +R75 VOUT.n511 VOUT.n384 585 +R76 VOUT.n445 VOUT.n385 585 +R77 VOUT.n512 VOUT.n385 585 +R78 VOUT.n444 VOUT.n443 585 +R79 VOUT.n443 VOUT.n378 585 +R80 VOUT.n442 VOUT.n377 585 +R81 VOUT.n518 VOUT.n377 585 +R82 VOUT.n410 VOUT.n376 585 +R83 VOUT.n519 VOUT.n376 585 +R84 VOUT.n438 VOUT.n375 585 +R85 VOUT.n520 VOUT.n375 585 +R86 VOUT.n437 VOUT.n436 585 +R87 VOUT.n436 VOUT.n367 585 +R88 VOUT.n435 VOUT.n366 585 +R89 VOUT.n526 VOUT.n366 585 +R90 VOUT.n412 VOUT.n365 585 +R91 VOUT.n527 VOUT.n365 585 +R92 VOUT.n431 VOUT.n364 585 +R93 VOUT.n528 VOUT.n364 585 +R94 VOUT.n430 VOUT.n429 585 +R95 VOUT.n429 VOUT.n356 585 +R96 VOUT.n428 VOUT.n355 585 +R97 VOUT.n534 VOUT.n355 585 +R98 VOUT.n414 VOUT.n354 585 +R99 VOUT.n535 VOUT.n354 585 +R100 VOUT.n424 VOUT.n353 585 +R101 VOUT.n536 VOUT.n353 585 +R102 VOUT.n423 VOUT.n422 585 +R103 VOUT.n422 VOUT.n345 585 +R104 VOUT.n421 VOUT.n344 585 +R105 VOUT.n542 VOUT.n344 585 +R106 VOUT.n416 VOUT.n343 585 +R107 VOUT.n543 VOUT.n343 585 +R108 VOUT.n417 VOUT.n342 585 +R109 VOUT.n544 VOUT.n342 585 +R110 VOUT.n325 VOUT.n323 585 +R111 VOUT.n326 VOUT.n325 585 +R112 VOUT.n552 VOUT.n551 585 +R113 VOUT.n551 VOUT.n550 585 +R114 VOUT.n324 VOUT.n321 585 +R115 VOUT.n331 VOUT.n324 585 +R116 VOUT.n556 VOUT.n320 585 +R117 VOUT.n332 VOUT.n320 585 +R118 VOUT.n558 VOUT.n557 585 +R119 VOUT.n558 VOUT.n310 585 +R120 VOUT.n330 VOUT.n313 585 +R121 VOUT.n313 VOUT.n310 585 +R122 VOUT.n334 VOUT.n333 585 +R123 VOUT.n333 VOUT.n332 585 +R124 VOUT.n329 VOUT.n327 585 +R125 VOUT.n331 VOUT.n327 585 +R126 VOUT.n549 VOUT.n548 585 +R127 VOUT.n550 VOUT.n549 585 +R128 VOUT.n547 VOUT.n328 585 +R129 VOUT.n328 VOUT.n326 585 +R130 VOUT.n546 VOUT.n545 585 +R131 VOUT.n545 VOUT.n544 585 +R132 VOUT.n341 VOUT.n340 585 +R133 VOUT.n543 VOUT.n341 585 +R134 VOUT.n541 VOUT.n540 585 +R135 VOUT.n542 VOUT.n541 585 +R136 VOUT.n539 VOUT.n346 585 +R137 VOUT.n346 VOUT.n345 585 +R138 VOUT.n538 VOUT.n537 585 +R139 VOUT.n537 VOUT.n536 585 +R140 VOUT.n352 VOUT.n351 585 +R141 VOUT.n535 VOUT.n352 585 +R142 VOUT.n533 VOUT.n532 585 +R143 VOUT.n534 VOUT.n533 585 +R144 VOUT.n531 VOUT.n357 585 +R145 VOUT.n357 VOUT.n356 585 +R146 VOUT.n530 VOUT.n529 585 +R147 VOUT.n529 VOUT.n528 585 +R148 VOUT.n363 VOUT.n362 585 +R149 VOUT.n527 VOUT.n363 585 +R150 VOUT.n525 VOUT.n524 585 +R151 VOUT.n526 VOUT.n525 585 +R152 VOUT.n523 VOUT.n368 585 +R153 VOUT.n368 VOUT.n367 585 +R154 VOUT.n522 VOUT.n521 585 +R155 VOUT.n521 VOUT.n520 585 +R156 VOUT.n374 VOUT.n373 585 +R157 VOUT.n519 VOUT.n374 585 +R158 VOUT.n517 VOUT.n516 585 +R159 VOUT.n518 VOUT.n517 585 +R160 VOUT.n515 VOUT.n379 585 +R161 VOUT.n379 VOUT.n378 585 +R162 VOUT.n514 VOUT.n513 585 +R163 VOUT.n513 VOUT.n512 585 +R164 VOUT.n630 VOUT.n629 585 +R165 VOUT.n629 VOUT.n628 585 +R166 VOUT.n13 VOUT.n11 585 +R167 VOUT.n15 VOUT.n13 585 +R168 VOUT.n634 VOUT.n10 585 +R169 VOUT.n286 VOUT.n10 585 +R170 VOUT.n635 VOUT.n9 585 +R171 VOUT.n285 VOUT.n9 585 +R172 VOUT.n636 VOUT.n8 585 +R173 VOUT.n284 VOUT.n8 585 +R174 VOUT.n111 VOUT.n6 585 +R175 VOUT.n112 VOUT.n111 585 +R176 VOUT.n640 VOUT.n5 585 +R177 VOUT.n274 VOUT.n5 585 +R178 VOUT.n641 VOUT.n4 585 +R179 VOUT.n273 VOUT.n4 585 +R180 VOUT.n642 VOUT.n3 585 +R181 VOUT.n272 VOUT.n3 585 +R182 VOUT.n127 VOUT.n1 585 +R183 VOUT.n127 VOUT.n119 585 +R184 VOUT.n263 VOUT.n262 585 +R185 VOUT.n264 VOUT.n263 585 +R186 VOUT.n261 VOUT.n126 585 +R187 VOUT.n126 VOUT.n125 585 +R188 VOUT.n132 VOUT.n128 585 +R189 VOUT.n254 VOUT.n132 585 +R190 VOUT.n257 VOUT.n256 585 +R191 VOUT.n256 VOUT.n255 585 +R192 VOUT.n131 VOUT.n130 585 +R193 VOUT.n133 VOUT.n131 585 +R194 VOUT.n244 VOUT.n243 585 +R195 VOUT.n245 VOUT.n244 585 +R196 VOUT.n141 VOUT.n140 585 +R197 VOUT.n140 VOUT.n139 585 +R198 VOUT.n239 VOUT.n238 585 +R199 VOUT.n238 VOUT.n237 585 +R200 VOUT.n144 VOUT.n143 585 +R201 VOUT.n145 VOUT.n144 585 +R202 VOUT.n227 VOUT.n226 585 +R203 VOUT.n228 VOUT.n227 585 +R204 VOUT.n290 VOUT.n16 585 +R205 VOUT.n628 VOUT.n16 585 +R206 VOUT.n289 VOUT.n288 585 +R207 VOUT.n288 VOUT.n15 585 +R208 VOUT.n287 VOUT.n109 585 +R209 VOUT.n287 VOUT.n286 585 +R210 VOUT.n115 VOUT.n110 585 +R211 VOUT.n285 VOUT.n110 585 +R212 VOUT.n283 VOUT.n282 585 +R213 VOUT.n284 VOUT.n283 585 +R214 VOUT.n114 VOUT.n113 585 +R215 VOUT.n113 VOUT.n112 585 +R216 VOUT.n276 VOUT.n275 585 +R217 VOUT.n275 VOUT.n274 585 +R218 VOUT.n118 VOUT.n117 585 +R219 VOUT.n273 VOUT.n118 585 +R220 VOUT.n271 VOUT.n270 585 +R221 VOUT.n272 VOUT.n271 585 +R222 VOUT.n121 VOUT.n120 585 +R223 VOUT.n120 VOUT.n119 585 +R224 VOUT.n266 VOUT.n265 585 +R225 VOUT.n265 VOUT.n264 585 +R226 VOUT.n124 VOUT.n123 585 +R227 VOUT.n125 VOUT.n124 585 +R228 VOUT.n253 VOUT.n252 585 +R229 VOUT.n254 VOUT.n253 585 +R230 VOUT.n135 VOUT.n134 585 +R231 VOUT.n255 VOUT.n134 585 +R232 VOUT.n248 VOUT.n247 585 +R233 VOUT.n247 VOUT.n133 585 +R234 VOUT.n246 VOUT.n137 585 +R235 VOUT.n246 VOUT.n245 585 +R236 VOUT.n148 VOUT.n138 585 +R237 VOUT.n139 VOUT.n138 585 +R238 VOUT.n236 VOUT.n235 585 +R239 VOUT.n237 VOUT.n236 585 +R240 VOUT.n147 VOUT.n146 585 +R241 VOUT.n146 VOUT.n145 585 +R242 VOUT.n230 VOUT.n229 585 +R243 VOUT.n229 VOUT.n228 585 +R244 VOUT.n224 VOUT.n152 585 +R245 VOUT.n223 VOUT.n222 585 +R246 VOUT.n220 VOUT.n153 585 +R247 VOUT.n220 VOUT.n151 585 +R248 VOUT.n219 VOUT.n218 585 +R249 VOUT.n217 VOUT.n216 585 +R250 VOUT.n215 VOUT.n155 585 +R251 VOUT.n213 VOUT.n212 585 +R252 VOUT.n211 VOUT.n156 585 +R253 VOUT.n210 VOUT.n209 585 +R254 VOUT.n207 VOUT.n157 585 +R255 VOUT.n205 VOUT.n204 585 +R256 VOUT.n203 VOUT.n158 585 +R257 VOUT.n201 VOUT.n200 585 +R258 VOUT.n198 VOUT.n161 585 +R259 VOUT.n196 VOUT.n195 585 +R260 VOUT.n194 VOUT.n162 585 +R261 VOUT.n193 VOUT.n192 585 +R262 VOUT.n190 VOUT.n163 585 +R263 VOUT.n188 VOUT.n187 585 +R264 VOUT.n186 VOUT.n164 585 +R265 VOUT.n185 VOUT.n184 585 +R266 VOUT.n182 VOUT.n165 585 +R267 VOUT.n180 VOUT.n179 585 +R268 VOUT.n178 VOUT.n166 585 +R269 VOUT.n177 VOUT.n176 585 +R270 VOUT.n174 VOUT.n173 585 +R271 VOUT.n172 VOUT.n171 585 +R272 VOUT.n150 VOUT.n149 585 +R273 VOUT.n151 VOUT.n150 585 +R274 VOUT.n293 VOUT.n292 585 +R275 VOUT.n107 VOUT.n30 585 +R276 VOUT.n106 VOUT.n105 585 +R277 VOUT.n103 VOUT.n102 585 +R278 VOUT.n101 VOUT.n100 585 +R279 VOUT.n99 VOUT.n98 585 +R280 VOUT.n97 VOUT.n96 585 +R281 VOUT.n95 VOUT.n94 585 +R282 VOUT.n93 VOUT.n92 585 +R283 VOUT.n71 VOUT.n70 585 +R284 VOUT.n69 VOUT.n68 585 +R285 VOUT.n67 VOUT.n66 585 +R286 VOUT.n65 VOUT.n64 585 +R287 VOUT.n63 VOUT.n62 585 +R288 VOUT.n61 VOUT.n60 585 +R289 VOUT.n59 VOUT.n58 585 +R290 VOUT.n57 VOUT.n56 585 +R291 VOUT.n55 VOUT.n54 585 +R292 VOUT.n53 VOUT.n52 585 +R293 VOUT.n51 VOUT.n50 585 +R294 VOUT.n49 VOUT.n48 585 +R295 VOUT.n47 VOUT.n46 585 +R296 VOUT.n45 VOUT.n44 585 +R297 VOUT.n43 VOUT.n42 585 +R298 VOUT.n41 VOUT.n40 585 +R299 VOUT.n39 VOUT.n38 585 +R300 VOUT.n37 VOUT.n36 585 +R301 VOUT.n14 VOUT.n12 585 +R302 VOUT.n626 VOUT.n310 316.827 +R303 VOUT.n512 VOUT.n511 316.827 +R304 VOUT.n88 VOUT.t1 304.466 +R305 VOUT.n88 VOUT.t34 302.262 +R306 VOUT.n627 VOUT.n626 300.661 +R307 VOUT.n81 VOUT.n79 289.615 +R308 VOUT.n74 VOUT.n72 289.615 +R309 VOUT.n228 VOUT.n151 284.498 +R310 VOUT.n628 VOUT.n627 284.498 +R311 VOUT.n167 VOUT.t27 278.498 +R312 VOUT.n159 VOUT.t30 278.498 +R313 VOUT.n33 VOUT.t12 278.498 +R314 VOUT.n31 VOUT.t32 278.498 +R315 VOUT.n89 VOUT.t2 264.649 +R316 VOUT.n626 VOUT.n625 256.663 +R317 VOUT.n626 VOUT.n295 256.663 +R318 VOUT.n626 VOUT.n296 256.663 +R319 VOUT.n626 VOUT.n297 256.663 +R320 VOUT.n626 VOUT.n298 256.663 +R321 VOUT.n626 VOUT.n299 256.663 +R322 VOUT.n626 VOUT.n300 256.663 +R323 VOUT.n626 VOUT.n301 256.663 +R324 VOUT.n626 VOUT.n302 256.663 +R325 VOUT.n626 VOUT.n303 256.663 +R326 VOUT.n626 VOUT.n304 256.663 +R327 VOUT.n626 VOUT.n305 256.663 +R328 VOUT.n626 VOUT.n306 256.663 +R329 VOUT.n626 VOUT.n307 256.663 +R330 VOUT.n626 VOUT.n308 256.663 +R331 VOUT.n626 VOUT.n309 256.663 +R332 VOUT.n511 VOUT.n386 256.663 +R333 VOUT.n511 VOUT.n387 256.663 +R334 VOUT.n511 VOUT.n388 256.663 +R335 VOUT.n511 VOUT.n389 256.663 +R336 VOUT.n511 VOUT.n390 256.663 +R337 VOUT.n511 VOUT.n391 256.663 +R338 VOUT.n511 VOUT.n392 256.663 +R339 VOUT.n511 VOUT.n393 256.663 +R340 VOUT.n511 VOUT.n394 256.663 +R341 VOUT.n511 VOUT.n395 256.663 +R342 VOUT.n511 VOUT.n396 256.663 +R343 VOUT.n511 VOUT.n397 256.663 +R344 VOUT.n511 VOUT.n398 256.663 +R345 VOUT.n511 VOUT.n399 256.663 +R346 VOUT.n511 VOUT.n400 256.663 +R347 VOUT.n511 VOUT.n510 256.663 +R348 VOUT.n221 VOUT.n151 256.663 +R349 VOUT.n154 VOUT.n151 256.663 +R350 VOUT.n214 VOUT.n151 256.663 +R351 VOUT.n208 VOUT.n151 256.663 +R352 VOUT.n206 VOUT.n151 256.663 +R353 VOUT.n199 VOUT.n151 256.663 +R354 VOUT.n197 VOUT.n151 256.663 +R355 VOUT.n191 VOUT.n151 256.663 +R356 VOUT.n189 VOUT.n151 256.663 +R357 VOUT.n183 VOUT.n151 256.663 +R358 VOUT.n181 VOUT.n151 256.663 +R359 VOUT.n175 VOUT.n151 256.663 +R360 VOUT.n170 VOUT.n151 256.663 +R361 VOUT.n627 VOUT.n294 256.663 +R362 VOUT.n627 VOUT.n29 256.663 +R363 VOUT.n627 VOUT.n28 256.663 +R364 VOUT.n627 VOUT.n27 256.663 +R365 VOUT.n627 VOUT.n26 256.663 +R366 VOUT.n627 VOUT.n25 256.663 +R367 VOUT.n627 VOUT.n24 256.663 +R368 VOUT.n627 VOUT.n23 256.663 +R369 VOUT.n627 VOUT.n22 256.663 +R370 VOUT.n627 VOUT.n21 256.663 +R371 VOUT.n627 VOUT.n20 256.663 +R372 VOUT.n627 VOUT.n19 256.663 +R373 VOUT.n627 VOUT.n18 256.663 +R374 VOUT.n627 VOUT.n17 256.663 +R375 VOUT.n90 VOUT.t35 249.881 +R376 VOUT.n333 VOUT.n313 240.244 +R377 VOUT.n333 VOUT.n327 240.244 +R378 VOUT.n549 VOUT.n327 240.244 +R379 VOUT.n549 VOUT.n328 240.244 +R380 VOUT.n545 VOUT.n328 240.244 +R381 VOUT.n545 VOUT.n341 240.244 +R382 VOUT.n541 VOUT.n341 240.244 +R383 VOUT.n541 VOUT.n346 240.244 +R384 VOUT.n537 VOUT.n346 240.244 +R385 VOUT.n537 VOUT.n352 240.244 +R386 VOUT.n533 VOUT.n352 240.244 +R387 VOUT.n533 VOUT.n357 240.244 +R388 VOUT.n529 VOUT.n357 240.244 +R389 VOUT.n529 VOUT.n363 240.244 +R390 VOUT.n525 VOUT.n363 240.244 +R391 VOUT.n525 VOUT.n368 240.244 +R392 VOUT.n521 VOUT.n368 240.244 +R393 VOUT.n521 VOUT.n374 240.244 +R394 VOUT.n517 VOUT.n374 240.244 +R395 VOUT.n517 VOUT.n379 240.244 +R396 VOUT.n513 VOUT.n379 240.244 +R397 VOUT.n558 VOUT.n320 240.244 +R398 VOUT.n324 VOUT.n320 240.244 +R399 VOUT.n551 VOUT.n324 240.244 +R400 VOUT.n551 VOUT.n325 240.244 +R401 VOUT.n342 VOUT.n325 240.244 +R402 VOUT.n343 VOUT.n342 240.244 +R403 VOUT.n344 VOUT.n343 240.244 +R404 VOUT.n422 VOUT.n344 240.244 +R405 VOUT.n422 VOUT.n353 240.244 +R406 VOUT.n354 VOUT.n353 240.244 +R407 VOUT.n355 VOUT.n354 240.244 +R408 VOUT.n429 VOUT.n355 240.244 +R409 VOUT.n429 VOUT.n364 240.244 +R410 VOUT.n365 VOUT.n364 240.244 +R411 VOUT.n366 VOUT.n365 240.244 +R412 VOUT.n436 VOUT.n366 240.244 +R413 VOUT.n436 VOUT.n375 240.244 +R414 VOUT.n376 VOUT.n375 240.244 +R415 VOUT.n377 VOUT.n376 240.244 +R416 VOUT.n443 VOUT.n377 240.244 +R417 VOUT.n443 VOUT.n385 240.244 +R418 VOUT.n227 VOUT.n144 240.244 +R419 VOUT.n238 VOUT.n144 240.244 +R420 VOUT.n238 VOUT.n140 240.244 +R421 VOUT.n244 VOUT.n140 240.244 +R422 VOUT.n244 VOUT.n131 240.244 +R423 VOUT.n256 VOUT.n131 240.244 +R424 VOUT.n256 VOUT.n132 240.244 +R425 VOUT.n132 VOUT.n126 240.244 +R426 VOUT.n263 VOUT.n126 240.244 +R427 VOUT.n263 VOUT.n127 240.244 +R428 VOUT.n127 VOUT.n3 240.244 +R429 VOUT.n4 VOUT.n3 240.244 +R430 VOUT.n5 VOUT.n4 240.244 +R431 VOUT.n111 VOUT.n5 240.244 +R432 VOUT.n111 VOUT.n8 240.244 +R433 VOUT.n9 VOUT.n8 240.244 +R434 VOUT.n10 VOUT.n9 240.244 +R435 VOUT.n13 VOUT.n10 240.244 +R436 VOUT.n629 VOUT.n13 240.244 +R437 VOUT.n229 VOUT.n146 240.244 +R438 VOUT.n236 VOUT.n146 240.244 +R439 VOUT.n236 VOUT.n138 240.244 +R440 VOUT.n246 VOUT.n138 240.244 +R441 VOUT.n247 VOUT.n246 240.244 +R442 VOUT.n247 VOUT.n134 240.244 +R443 VOUT.n253 VOUT.n134 240.244 +R444 VOUT.n253 VOUT.n124 240.244 +R445 VOUT.n265 VOUT.n124 240.244 +R446 VOUT.n265 VOUT.n120 240.244 +R447 VOUT.n271 VOUT.n120 240.244 +R448 VOUT.n271 VOUT.n118 240.244 +R449 VOUT.n275 VOUT.n118 240.244 +R450 VOUT.n275 VOUT.n113 240.244 +R451 VOUT.n283 VOUT.n113 240.244 +R452 VOUT.n283 VOUT.n110 240.244 +R453 VOUT.n287 VOUT.n110 240.244 +R454 VOUT.n288 VOUT.n287 240.244 +R455 VOUT.n288 VOUT.n16 240.244 +R456 VOUT.n168 VOUT.t26 233.892 +R457 VOUT.n160 VOUT.t29 233.892 +R458 VOUT.n34 VOUT.t13 233.892 +R459 VOUT.n32 VOUT.t33 233.892 +R460 VOUT.n405 VOUT.t14 228.01 +R461 VOUT.n407 VOUT.t18 228.01 +R462 VOUT.n317 VOUT.t21 228.01 +R463 VOUT.n315 VOUT.t6 228.01 +R464 VOUT.n167 VOUT.t24 207.963 +R465 VOUT.n159 VOUT.t28 207.963 +R466 VOUT.n33 VOUT.t10 207.963 +R467 VOUT.n31 VOUT.t31 207.963 +R468 VOUT.n82 VOUT.n81 185 +R469 VOUT.n75 VOUT.n74 185 +R470 VOUT.n405 VOUT.t16 175.381 +R471 VOUT.n407 VOUT.t19 175.381 +R472 VOUT.n317 VOUT.t23 175.381 +R473 VOUT.n315 VOUT.t9 175.381 +R474 VOUT.t4 VOUT.n80 167.117 +R475 VOUT.t5 VOUT.n73 167.117 +R476 VOUT.n401 VOUT.n384 163.367 +R477 VOUT.n509 VOUT.n402 163.367 +R478 VOUT.n505 VOUT.n504 163.367 +R479 VOUT.n501 VOUT.n500 163.367 +R480 VOUT.n497 VOUT.n496 163.367 +R481 VOUT.n493 VOUT.n492 163.367 +R482 VOUT.n489 VOUT.n488 163.367 +R483 VOUT.n484 VOUT.n483 163.367 +R484 VOUT.n480 VOUT.n479 163.367 +R485 VOUT.n476 VOUT.n475 163.367 +R486 VOUT.n472 VOUT.n471 163.367 +R487 VOUT.n468 VOUT.n467 163.367 +R488 VOUT.n464 VOUT.n463 163.367 +R489 VOUT.n460 VOUT.n459 163.367 +R490 VOUT.n456 VOUT.n455 163.367 +R491 VOUT.n451 VOUT.n450 163.367 +R492 VOUT.n312 VOUT.n311 163.367 +R493 VOUT.n619 VOUT.n311 163.367 +R494 VOUT.n617 VOUT.n616 163.367 +R495 VOUT.n613 VOUT.n612 163.367 +R496 VOUT.n609 VOUT.n608 163.367 +R497 VOUT.n605 VOUT.n604 163.367 +R498 VOUT.n601 VOUT.n600 163.367 +R499 VOUT.n596 VOUT.n595 163.367 +R500 VOUT.n592 VOUT.n591 163.367 +R501 VOUT.n588 VOUT.n587 163.367 +R502 VOUT.n584 VOUT.n583 163.367 +R503 VOUT.n580 VOUT.n579 163.367 +R504 VOUT.n576 VOUT.n575 163.367 +R505 VOUT.n572 VOUT.n571 163.367 +R506 VOUT.n568 VOUT.n567 163.367 +R507 VOUT.n563 VOUT.n562 163.367 +R508 VOUT.n222 VOUT.n220 163.367 +R509 VOUT.n220 VOUT.n219 163.367 +R510 VOUT.n216 VOUT.n215 163.367 +R511 VOUT.n213 VOUT.n156 163.367 +R512 VOUT.n209 VOUT.n207 163.367 +R513 VOUT.n205 VOUT.n158 163.367 +R514 VOUT.n200 VOUT.n198 163.367 +R515 VOUT.n196 VOUT.n162 163.367 +R516 VOUT.n192 VOUT.n190 163.367 +R517 VOUT.n188 VOUT.n164 163.367 +R518 VOUT.n184 VOUT.n182 163.367 +R519 VOUT.n180 VOUT.n166 163.367 +R520 VOUT.n176 VOUT.n174 163.367 +R521 VOUT.n171 VOUT.n150 163.367 +R522 VOUT.n38 VOUT.n37 163.367 +R523 VOUT.n42 VOUT.n41 163.367 +R524 VOUT.n46 VOUT.n45 163.367 +R525 VOUT.n50 VOUT.n49 163.367 +R526 VOUT.n54 VOUT.n53 163.367 +R527 VOUT.n58 VOUT.n57 163.367 +R528 VOUT.n62 VOUT.n61 163.367 +R529 VOUT.n66 VOUT.n65 163.367 +R530 VOUT.n70 VOUT.n69 163.367 +R531 VOUT.n94 VOUT.n93 163.367 +R532 VOUT.n98 VOUT.n97 163.367 +R533 VOUT.n102 VOUT.n101 163.367 +R534 VOUT.n105 VOUT.n30 163.367 +R535 VOUT.n228 VOUT.n145 161.647 +R536 VOUT.n237 VOUT.n145 161.647 +R537 VOUT.n245 VOUT.n139 161.647 +R538 VOUT.n245 VOUT.n133 161.647 +R539 VOUT.n255 VOUT.n133 161.647 +R540 VOUT.n255 VOUT.n254 161.647 +R541 VOUT.n254 VOUT.n125 161.647 +R542 VOUT.n264 VOUT.n125 161.647 +R543 VOUT.n272 VOUT.n119 161.647 +R544 VOUT.n273 VOUT.n272 161.647 +R545 VOUT.n274 VOUT.n273 161.647 +R546 VOUT.n274 VOUT.n112 161.647 +R547 VOUT.n284 VOUT.n112 161.647 +R548 VOUT.n285 VOUT.n284 161.647 +R549 VOUT.n286 VOUT.n15 161.647 +R550 VOUT.n628 VOUT.n15 161.647 +R551 VOUT.n332 VOUT.n310 161.647 +R552 VOUT.n332 VOUT.n331 161.647 +R553 VOUT.n550 VOUT.n326 161.647 +R554 VOUT.n544 VOUT.n326 161.647 +R555 VOUT.n544 VOUT.n543 161.647 +R556 VOUT.n543 VOUT.n542 161.647 +R557 VOUT.n542 VOUT.n345 161.647 +R558 VOUT.n536 VOUT.n345 161.647 +R559 VOUT.n536 VOUT.n535 161.647 +R560 VOUT.n534 VOUT.n356 161.647 +R561 VOUT.n528 VOUT.n356 161.647 +R562 VOUT.n528 VOUT.n527 161.647 +R563 VOUT.n527 VOUT.n526 161.647 +R564 VOUT.n526 VOUT.n367 161.647 +R565 VOUT.n520 VOUT.n367 161.647 +R566 VOUT.n520 VOUT.n519 161.647 +R567 VOUT.n518 VOUT.n378 161.647 +R568 VOUT.n512 VOUT.n378 161.647 +R569 VOUT.n331 VOUT.t7 148.714 +R570 VOUT.t15 VOUT.n518 148.714 +R571 VOUT.n406 VOUT.t17 123.019 +R572 VOUT.n408 VOUT.t20 123.019 +R573 VOUT.n318 VOUT.t22 123.019 +R574 VOUT.n316 VOUT.t8 123.019 +R575 VOUT.n237 VOUT.t25 116.385 +R576 VOUT.n286 VOUT.t11 116.385 +R577 VOUT.n91 VOUT.n90 88.0899 +R578 VOUT.n264 VOUT.t0 80.8234 +R579 VOUT.t0 VOUT.n119 80.8234 +R580 VOUT.n535 VOUT.t3 80.8234 +R581 VOUT.t3 VOUT.n534 80.8234 +R582 VOUT.n510 VOUT.n509 71.676 +R583 VOUT.n505 VOUT.n400 71.676 +R584 VOUT.n501 VOUT.n399 71.676 +R585 VOUT.n497 VOUT.n398 71.676 +R586 VOUT.n493 VOUT.n397 71.676 +R587 VOUT.n489 VOUT.n396 71.676 +R588 VOUT.n484 VOUT.n395 71.676 +R589 VOUT.n480 VOUT.n394 71.676 +R590 VOUT.n476 VOUT.n393 71.676 +R591 VOUT.n472 VOUT.n392 71.676 +R592 VOUT.n468 VOUT.n391 71.676 +R593 VOUT.n464 VOUT.n390 71.676 +R594 VOUT.n460 VOUT.n389 71.676 +R595 VOUT.n456 VOUT.n388 71.676 +R596 VOUT.n451 VOUT.n387 71.676 +R597 VOUT.n447 VOUT.n386 71.676 +R598 VOUT.n625 VOUT.n624 71.676 +R599 VOUT.n619 VOUT.n295 71.676 +R600 VOUT.n616 VOUT.n296 71.676 +R601 VOUT.n612 VOUT.n297 71.676 +R602 VOUT.n608 VOUT.n298 71.676 +R603 VOUT.n604 VOUT.n299 71.676 +R604 VOUT.n600 VOUT.n300 71.676 +R605 VOUT.n595 VOUT.n301 71.676 +R606 VOUT.n591 VOUT.n302 71.676 +R607 VOUT.n587 VOUT.n303 71.676 +R608 VOUT.n583 VOUT.n304 71.676 +R609 VOUT.n579 VOUT.n305 71.676 +R610 VOUT.n575 VOUT.n306 71.676 +R611 VOUT.n571 VOUT.n307 71.676 +R612 VOUT.n567 VOUT.n308 71.676 +R613 VOUT.n562 VOUT.n309 71.676 +R614 VOUT.n625 VOUT.n312 71.676 +R615 VOUT.n617 VOUT.n295 71.676 +R616 VOUT.n613 VOUT.n296 71.676 +R617 VOUT.n609 VOUT.n297 71.676 +R618 VOUT.n605 VOUT.n298 71.676 +R619 VOUT.n601 VOUT.n299 71.676 +R620 VOUT.n596 VOUT.n300 71.676 +R621 VOUT.n592 VOUT.n301 71.676 +R622 VOUT.n588 VOUT.n302 71.676 +R623 VOUT.n584 VOUT.n303 71.676 +R624 VOUT.n580 VOUT.n304 71.676 +R625 VOUT.n576 VOUT.n305 71.676 +R626 VOUT.n572 VOUT.n306 71.676 +R627 VOUT.n568 VOUT.n307 71.676 +R628 VOUT.n563 VOUT.n308 71.676 +R629 VOUT.n559 VOUT.n309 71.676 +R630 VOUT.n450 VOUT.n386 71.676 +R631 VOUT.n455 VOUT.n387 71.676 +R632 VOUT.n459 VOUT.n388 71.676 +R633 VOUT.n463 VOUT.n389 71.676 +R634 VOUT.n467 VOUT.n390 71.676 +R635 VOUT.n471 VOUT.n391 71.676 +R636 VOUT.n475 VOUT.n392 71.676 +R637 VOUT.n479 VOUT.n393 71.676 +R638 VOUT.n483 VOUT.n394 71.676 +R639 VOUT.n488 VOUT.n395 71.676 +R640 VOUT.n492 VOUT.n396 71.676 +R641 VOUT.n496 VOUT.n397 71.676 +R642 VOUT.n500 VOUT.n398 71.676 +R643 VOUT.n504 VOUT.n399 71.676 +R644 VOUT.n402 VOUT.n400 71.676 +R645 VOUT.n510 VOUT.n401 71.676 +R646 VOUT.n221 VOUT.n152 71.676 +R647 VOUT.n219 VOUT.n154 71.676 +R648 VOUT.n215 VOUT.n214 71.676 +R649 VOUT.n208 VOUT.n156 71.676 +R650 VOUT.n207 VOUT.n206 71.676 +R651 VOUT.n199 VOUT.n158 71.676 +R652 VOUT.n198 VOUT.n197 71.676 +R653 VOUT.n191 VOUT.n162 71.676 +R654 VOUT.n190 VOUT.n189 71.676 +R655 VOUT.n183 VOUT.n164 71.676 +R656 VOUT.n182 VOUT.n181 71.676 +R657 VOUT.n175 VOUT.n166 71.676 +R658 VOUT.n174 VOUT.n170 71.676 +R659 VOUT.n37 VOUT.n17 71.676 +R660 VOUT.n41 VOUT.n18 71.676 +R661 VOUT.n45 VOUT.n19 71.676 +R662 VOUT.n49 VOUT.n20 71.676 +R663 VOUT.n53 VOUT.n21 71.676 +R664 VOUT.n57 VOUT.n22 71.676 +R665 VOUT.n61 VOUT.n23 71.676 +R666 VOUT.n65 VOUT.n24 71.676 +R667 VOUT.n69 VOUT.n25 71.676 +R668 VOUT.n93 VOUT.n26 71.676 +R669 VOUT.n97 VOUT.n27 71.676 +R670 VOUT.n101 VOUT.n28 71.676 +R671 VOUT.n105 VOUT.n29 71.676 +R672 VOUT.n294 VOUT.n293 71.676 +R673 VOUT.n222 VOUT.n221 71.676 +R674 VOUT.n216 VOUT.n154 71.676 +R675 VOUT.n214 VOUT.n213 71.676 +R676 VOUT.n209 VOUT.n208 71.676 +R677 VOUT.n206 VOUT.n205 71.676 +R678 VOUT.n200 VOUT.n199 71.676 +R679 VOUT.n197 VOUT.n196 71.676 +R680 VOUT.n192 VOUT.n191 71.676 +R681 VOUT.n189 VOUT.n188 71.676 +R682 VOUT.n184 VOUT.n183 71.676 +R683 VOUT.n181 VOUT.n180 71.676 +R684 VOUT.n176 VOUT.n175 71.676 +R685 VOUT.n171 VOUT.n170 71.676 +R686 VOUT.n294 VOUT.n30 71.676 +R687 VOUT.n102 VOUT.n29 71.676 +R688 VOUT.n98 VOUT.n28 71.676 +R689 VOUT.n94 VOUT.n27 71.676 +R690 VOUT.n70 VOUT.n26 71.676 +R691 VOUT.n66 VOUT.n25 71.676 +R692 VOUT.n62 VOUT.n24 71.676 +R693 VOUT.n58 VOUT.n23 71.676 +R694 VOUT.n54 VOUT.n22 71.676 +R695 VOUT.n50 VOUT.n21 71.676 +R696 VOUT.n46 VOUT.n20 71.676 +R697 VOUT.n42 VOUT.n19 71.676 +R698 VOUT.n38 VOUT.n18 71.676 +R699 VOUT.n17 VOUT.n14 71.676 +R700 VOUT.n86 VOUT.n78 58.1631 +R701 VOUT.n406 VOUT.n405 52.3641 +R702 VOUT.n408 VOUT.n407 52.3641 +R703 VOUT.n318 VOUT.n317 52.3641 +R704 VOUT.n316 VOUT.n315 52.3641 +R705 VOUT.n81 VOUT.t4 52.3082 +R706 VOUT.n74 VOUT.t5 52.3082 +R707 VOUT.n86 VOUT.n85 48.0884 +R708 VOUT.t25 VOUT.n139 45.2613 +R709 VOUT.t11 VOUT.n285 45.2613 +R710 VOUT.n168 VOUT.n167 44.6066 +R711 VOUT.n160 VOUT.n159 44.6066 +R712 VOUT.n34 VOUT.n33 44.6066 +R713 VOUT.n32 VOUT.n31 44.6066 +R714 VOUT.n486 VOUT.n406 34.3278 +R715 VOUT.n453 VOUT.n408 34.3278 +R716 VOUT.n565 VOUT.n318 34.3278 +R717 VOUT.n598 VOUT.n316 34.3278 +R718 VOUT.n169 VOUT.n168 34.3278 +R719 VOUT.n202 VOUT.n160 34.3278 +R720 VOUT.n35 VOUT.n34 34.3278 +R721 VOUT.n104 VOUT.n32 34.3278 +R722 VOUT.n403 VOUT.n383 31.609 +R723 VOUT.n448 VOUT.n446 31.609 +R724 VOUT.n623 VOUT.n314 31.609 +R725 VOUT.n560 VOUT.n319 31.609 +R726 VOUT.n225 VOUT.n224 26.8956 +R727 VOUT.n231 VOUT.n149 26.8956 +R728 VOUT.n631 VOUT.n12 26.8956 +R729 VOUT.n292 VOUT.n291 26.8956 +R730 VOUT.n334 VOUT.n330 19.3944 +R731 VOUT.n334 VOUT.n329 19.3944 +R732 VOUT.n548 VOUT.n329 19.3944 +R733 VOUT.n548 VOUT.n547 19.3944 +R734 VOUT.n547 VOUT.n546 19.3944 +R735 VOUT.n546 VOUT.n340 19.3944 +R736 VOUT.n540 VOUT.n340 19.3944 +R737 VOUT.n540 VOUT.n539 19.3944 +R738 VOUT.n539 VOUT.n538 19.3944 +R739 VOUT.n538 VOUT.n351 19.3944 +R740 VOUT.n532 VOUT.n351 19.3944 +R741 VOUT.n532 VOUT.n531 19.3944 +R742 VOUT.n531 VOUT.n530 19.3944 +R743 VOUT.n530 VOUT.n362 19.3944 +R744 VOUT.n524 VOUT.n362 19.3944 +R745 VOUT.n524 VOUT.n523 19.3944 +R746 VOUT.n523 VOUT.n522 19.3944 +R747 VOUT.n522 VOUT.n373 19.3944 +R748 VOUT.n516 VOUT.n373 19.3944 +R749 VOUT.n516 VOUT.n515 19.3944 +R750 VOUT.n515 VOUT.n514 19.3944 +R751 VOUT.n557 VOUT.n556 19.3944 +R752 VOUT.n556 VOUT.n321 19.3944 +R753 VOUT.n552 VOUT.n321 19.3944 +R754 VOUT.n552 VOUT.n323 19.3944 +R755 VOUT.n417 VOUT.n323 19.3944 +R756 VOUT.n417 VOUT.n416 19.3944 +R757 VOUT.n421 VOUT.n416 19.3944 +R758 VOUT.n423 VOUT.n421 19.3944 +R759 VOUT.n424 VOUT.n423 19.3944 +R760 VOUT.n424 VOUT.n414 19.3944 +R761 VOUT.n428 VOUT.n414 19.3944 +R762 VOUT.n430 VOUT.n428 19.3944 +R763 VOUT.n431 VOUT.n430 19.3944 +R764 VOUT.n431 VOUT.n412 19.3944 +R765 VOUT.n435 VOUT.n412 19.3944 +R766 VOUT.n437 VOUT.n435 19.3944 +R767 VOUT.n438 VOUT.n437 19.3944 +R768 VOUT.n438 VOUT.n410 19.3944 +R769 VOUT.n442 VOUT.n410 19.3944 +R770 VOUT.n444 VOUT.n442 19.3944 +R771 VOUT.n445 VOUT.n444 19.3944 +R772 VOUT.n226 VOUT.n143 19.3944 +R773 VOUT.n239 VOUT.n143 19.3944 +R774 VOUT.n239 VOUT.n141 19.3944 +R775 VOUT.n243 VOUT.n141 19.3944 +R776 VOUT.n243 VOUT.n130 19.3944 +R777 VOUT.n257 VOUT.n130 19.3944 +R778 VOUT.n257 VOUT.n128 19.3944 +R779 VOUT.n261 VOUT.n128 19.3944 +R780 VOUT.n262 VOUT.n261 19.3944 +R781 VOUT.n262 VOUT.n1 19.3944 +R782 VOUT.n642 VOUT.n1 19.3944 +R783 VOUT.n642 VOUT.n641 19.3944 +R784 VOUT.n641 VOUT.n640 19.3944 +R785 VOUT.n640 VOUT.n6 19.3944 +R786 VOUT.n636 VOUT.n6 19.3944 +R787 VOUT.n636 VOUT.n635 19.3944 +R788 VOUT.n635 VOUT.n634 19.3944 +R789 VOUT.n634 VOUT.n11 19.3944 +R790 VOUT.n630 VOUT.n11 19.3944 +R791 VOUT.n230 VOUT.n147 19.3944 +R792 VOUT.n235 VOUT.n147 19.3944 +R793 VOUT.n235 VOUT.n148 19.3944 +R794 VOUT.n148 VOUT.n137 19.3944 +R795 VOUT.n248 VOUT.n137 19.3944 +R796 VOUT.n248 VOUT.n135 19.3944 +R797 VOUT.n252 VOUT.n135 19.3944 +R798 VOUT.n252 VOUT.n123 19.3944 +R799 VOUT.n266 VOUT.n123 19.3944 +R800 VOUT.n266 VOUT.n121 19.3944 +R801 VOUT.n270 VOUT.n121 19.3944 +R802 VOUT.n270 VOUT.n117 19.3944 +R803 VOUT.n276 VOUT.n117 19.3944 +R804 VOUT.n276 VOUT.n114 19.3944 +R805 VOUT.n282 VOUT.n114 19.3944 +R806 VOUT.n282 VOUT.n115 19.3944 +R807 VOUT.n115 VOUT.n109 19.3944 +R808 VOUT.n289 VOUT.n109 19.3944 +R809 VOUT.n290 VOUT.n289 19.3944 +R810 VOUT.n90 VOUT.n89 18.0638 +R811 VOUT.n88 VOUT.n87 13.041 +R812 VOUT.n550 VOUT.t7 12.9322 +R813 VOUT.n519 VOUT.t15 12.9322 +R814 VOUT.n404 VOUT.n403 10.6151 +R815 VOUT.n508 VOUT.n404 10.6151 +R816 VOUT.n508 VOUT.n507 10.6151 +R817 VOUT.n507 VOUT.n506 10.6151 +R818 VOUT.n506 VOUT.n503 10.6151 +R819 VOUT.n503 VOUT.n502 10.6151 +R820 VOUT.n502 VOUT.n499 10.6151 +R821 VOUT.n499 VOUT.n498 10.6151 +R822 VOUT.n498 VOUT.n495 10.6151 +R823 VOUT.n495 VOUT.n494 10.6151 +R824 VOUT.n494 VOUT.n491 10.6151 +R825 VOUT.n491 VOUT.n490 10.6151 +R826 VOUT.n490 VOUT.n487 10.6151 +R827 VOUT.n485 VOUT.n482 10.6151 +R828 VOUT.n482 VOUT.n481 10.6151 +R829 VOUT.n481 VOUT.n478 10.6151 +R830 VOUT.n478 VOUT.n477 10.6151 +R831 VOUT.n477 VOUT.n474 10.6151 +R832 VOUT.n474 VOUT.n473 10.6151 +R833 VOUT.n473 VOUT.n470 10.6151 +R834 VOUT.n470 VOUT.n469 10.6151 +R835 VOUT.n469 VOUT.n466 10.6151 +R836 VOUT.n466 VOUT.n465 10.6151 +R837 VOUT.n465 VOUT.n462 10.6151 +R838 VOUT.n462 VOUT.n461 10.6151 +R839 VOUT.n461 VOUT.n458 10.6151 +R840 VOUT.n458 VOUT.n457 10.6151 +R841 VOUT.n457 VOUT.n454 10.6151 +R842 VOUT.n452 VOUT.n449 10.6151 +R843 VOUT.n449 VOUT.n448 10.6151 +R844 VOUT.n623 VOUT.n622 10.6151 +R845 VOUT.n622 VOUT.n621 10.6151 +R846 VOUT.n621 VOUT.n620 10.6151 +R847 VOUT.n620 VOUT.n618 10.6151 +R848 VOUT.n618 VOUT.n615 10.6151 +R849 VOUT.n615 VOUT.n614 10.6151 +R850 VOUT.n614 VOUT.n611 10.6151 +R851 VOUT.n611 VOUT.n610 10.6151 +R852 VOUT.n610 VOUT.n607 10.6151 +R853 VOUT.n607 VOUT.n606 10.6151 +R854 VOUT.n606 VOUT.n603 10.6151 +R855 VOUT.n603 VOUT.n602 10.6151 +R856 VOUT.n602 VOUT.n599 10.6151 +R857 VOUT.n597 VOUT.n594 10.6151 +R858 VOUT.n594 VOUT.n593 10.6151 +R859 VOUT.n593 VOUT.n590 10.6151 +R860 VOUT.n590 VOUT.n589 10.6151 +R861 VOUT.n589 VOUT.n586 10.6151 +R862 VOUT.n586 VOUT.n585 10.6151 +R863 VOUT.n585 VOUT.n582 10.6151 +R864 VOUT.n582 VOUT.n581 10.6151 +R865 VOUT.n581 VOUT.n578 10.6151 +R866 VOUT.n578 VOUT.n577 10.6151 +R867 VOUT.n577 VOUT.n574 10.6151 +R868 VOUT.n574 VOUT.n573 10.6151 +R869 VOUT.n573 VOUT.n570 10.6151 +R870 VOUT.n570 VOUT.n569 10.6151 +R871 VOUT.n569 VOUT.n566 10.6151 +R872 VOUT.n564 VOUT.n561 10.6151 +R873 VOUT.n561 VOUT.n560 10.6151 +R874 VOUT.n224 VOUT.n223 10.6151 +R875 VOUT.n223 VOUT.n153 10.6151 +R876 VOUT.n218 VOUT.n153 10.6151 +R877 VOUT.n218 VOUT.n217 10.6151 +R878 VOUT.n217 VOUT.n155 10.6151 +R879 VOUT.n212 VOUT.n155 10.6151 +R880 VOUT.n212 VOUT.n211 10.6151 +R881 VOUT.n211 VOUT.n210 10.6151 +R882 VOUT.n210 VOUT.n157 10.6151 +R883 VOUT.n204 VOUT.n157 10.6151 +R884 VOUT.n204 VOUT.n203 10.6151 +R885 VOUT.n201 VOUT.n161 10.6151 +R886 VOUT.n195 VOUT.n161 10.6151 +R887 VOUT.n195 VOUT.n194 10.6151 +R888 VOUT.n194 VOUT.n193 10.6151 +R889 VOUT.n193 VOUT.n163 10.6151 +R890 VOUT.n187 VOUT.n163 10.6151 +R891 VOUT.n187 VOUT.n186 10.6151 +R892 VOUT.n186 VOUT.n185 10.6151 +R893 VOUT.n185 VOUT.n165 10.6151 +R894 VOUT.n179 VOUT.n165 10.6151 +R895 VOUT.n179 VOUT.n178 10.6151 +R896 VOUT.n178 VOUT.n177 10.6151 +R897 VOUT.n173 VOUT.n172 10.6151 +R898 VOUT.n172 VOUT.n149 10.6151 +R899 VOUT.n36 VOUT.n12 10.6151 +R900 VOUT.n39 VOUT.n36 10.6151 +R901 VOUT.n40 VOUT.n39 10.6151 +R902 VOUT.n43 VOUT.n40 10.6151 +R903 VOUT.n44 VOUT.n43 10.6151 +R904 VOUT.n47 VOUT.n44 10.6151 +R905 VOUT.n48 VOUT.n47 10.6151 +R906 VOUT.n51 VOUT.n48 10.6151 +R907 VOUT.n52 VOUT.n51 10.6151 +R908 VOUT.n55 VOUT.n52 10.6151 +R909 VOUT.n56 VOUT.n55 10.6151 +R910 VOUT.n60 VOUT.n59 10.6151 +R911 VOUT.n63 VOUT.n60 10.6151 +R912 VOUT.n64 VOUT.n63 10.6151 +R913 VOUT.n67 VOUT.n64 10.6151 +R914 VOUT.n68 VOUT.n67 10.6151 +R915 VOUT.n71 VOUT.n68 10.6151 +R916 VOUT.n95 VOUT.n92 10.6151 +R917 VOUT.n96 VOUT.n95 10.6151 +R918 VOUT.n99 VOUT.n96 10.6151 +R919 VOUT.n100 VOUT.n99 10.6151 +R920 VOUT.n103 VOUT.n100 10.6151 +R921 VOUT.n107 VOUT.n106 10.6151 +R922 VOUT.n292 VOUT.n107 10.6151 +R923 VOUT.n454 VOUT.n453 9.83465 +R924 VOUT.n566 VOUT.n565 9.83465 +R925 VOUT.n202 VOUT.n201 9.83465 +R926 VOUT.n59 VOUT.n35 9.83465 +R927 VOUT.n82 VOUT.n80 9.71174 +R928 VOUT.n75 VOUT.n73 9.71174 +R929 VOUT.n85 VOUT.n84 9.45567 +R930 VOUT.n78 VOUT.n77 9.45567 +R931 VOUT.n84 VOUT.n83 9.3005 +R932 VOUT.n77 VOUT.n76 9.3005 +R933 VOUT.n556 VOUT.n555 9.3005 +R934 VOUT.n554 VOUT.n321 9.3005 +R935 VOUT.n553 VOUT.n552 9.3005 +R936 VOUT.n323 VOUT.n322 9.3005 +R937 VOUT.n418 VOUT.n417 9.3005 +R938 VOUT.n419 VOUT.n416 9.3005 +R939 VOUT.n421 VOUT.n420 9.3005 +R940 VOUT.n423 VOUT.n415 9.3005 +R941 VOUT.n425 VOUT.n424 9.3005 +R942 VOUT.n426 VOUT.n414 9.3005 +R943 VOUT.n428 VOUT.n427 9.3005 +R944 VOUT.n430 VOUT.n413 9.3005 +R945 VOUT.n432 VOUT.n431 9.3005 +R946 VOUT.n433 VOUT.n412 9.3005 +R947 VOUT.n435 VOUT.n434 9.3005 +R948 VOUT.n437 VOUT.n411 9.3005 +R949 VOUT.n439 VOUT.n438 9.3005 +R950 VOUT.n440 VOUT.n410 9.3005 +R951 VOUT.n442 VOUT.n441 9.3005 +R952 VOUT.n444 VOUT.n409 9.3005 +R953 VOUT.n446 VOUT.n445 9.3005 +R954 VOUT.n557 VOUT.n319 9.3005 +R955 VOUT.n330 VOUT.n314 9.3005 +R956 VOUT.n335 VOUT.n334 9.3005 +R957 VOUT.n336 VOUT.n329 9.3005 +R958 VOUT.n548 VOUT.n337 9.3005 +R959 VOUT.n547 VOUT.n338 9.3005 +R960 VOUT.n546 VOUT.n339 9.3005 +R961 VOUT.n347 VOUT.n340 9.3005 +R962 VOUT.n540 VOUT.n348 9.3005 +R963 VOUT.n539 VOUT.n349 9.3005 +R964 VOUT.n538 VOUT.n350 9.3005 +R965 VOUT.n358 VOUT.n351 9.3005 +R966 VOUT.n532 VOUT.n359 9.3005 +R967 VOUT.n531 VOUT.n360 9.3005 +R968 VOUT.n530 VOUT.n361 9.3005 +R969 VOUT.n369 VOUT.n362 9.3005 +R970 VOUT.n524 VOUT.n370 9.3005 +R971 VOUT.n523 VOUT.n371 9.3005 +R972 VOUT.n522 VOUT.n372 9.3005 +R973 VOUT.n380 VOUT.n373 9.3005 +R974 VOUT.n516 VOUT.n381 9.3005 +R975 VOUT.n515 VOUT.n382 9.3005 +R976 VOUT.n514 VOUT.n383 9.3005 +R977 VOUT.n232 VOUT.n147 9.3005 +R978 VOUT.n235 VOUT.n234 9.3005 +R979 VOUT.n233 VOUT.n148 9.3005 +R980 VOUT.n137 VOUT.n136 9.3005 +R981 VOUT.n249 VOUT.n248 9.3005 +R982 VOUT.n250 VOUT.n135 9.3005 +R983 VOUT.n252 VOUT.n251 9.3005 +R984 VOUT.n123 VOUT.n122 9.3005 +R985 VOUT.n267 VOUT.n266 9.3005 +R986 VOUT.n268 VOUT.n121 9.3005 +R987 VOUT.n270 VOUT.n269 9.3005 +R988 VOUT.n117 VOUT.n116 9.3005 +R989 VOUT.n277 VOUT.n276 9.3005 +R990 VOUT.n278 VOUT.n114 9.3005 +R991 VOUT.n282 VOUT.n281 9.3005 +R992 VOUT.n280 VOUT.n115 9.3005 +R993 VOUT.n279 VOUT.n109 9.3005 +R994 VOUT.n289 VOUT.n108 9.3005 +R995 VOUT.n291 VOUT.n290 9.3005 +R996 VOUT.n231 VOUT.n230 9.3005 +R997 VOUT.n143 VOUT.n142 9.3005 +R998 VOUT.n240 VOUT.n239 9.3005 +R999 VOUT.n241 VOUT.n141 9.3005 +R1000 VOUT.n243 VOUT.n242 9.3005 +R1001 VOUT.n130 VOUT.n129 9.3005 +R1002 VOUT.n258 VOUT.n257 9.3005 +R1003 VOUT.n259 VOUT.n128 9.3005 +R1004 VOUT.n261 VOUT.n260 9.3005 +R1005 VOUT.n262 VOUT.n0 9.3005 +R1006 VOUT.n226 VOUT.n225 9.3005 +R1007 VBULK VOUT.n1 9.3005 +R1008 VOUT.n643 VOUT.n642 9.3005 +R1009 VOUT.n641 VOUT.n2 9.3005 +R1010 VOUT.n640 VOUT.n639 9.3005 +R1011 VOUT.n638 VOUT.n6 9.3005 +R1012 VOUT.n637 VOUT.n636 9.3005 +R1013 VOUT.n635 VOUT.n7 9.3005 +R1014 VOUT.n634 VOUT.n633 9.3005 +R1015 VOUT.n632 VOUT.n11 9.3005 +R1016 VOUT.n631 VOUT.n630 9.3005 +R1017 VOUT.n92 VOUT.n91 8.42977 +R1018 VOUT.n85 VOUT.n79 8.14595 +R1019 VOUT.n78 VOUT.n72 8.14595 +R1020 VOUT.n83 VOUT.n82 7.3702 +R1021 VOUT.n76 VOUT.n75 7.3702 +R1022 VOUT.n487 VOUT.n486 6.0883 +R1023 VOUT.n599 VOUT.n598 6.0883 +R1024 VOUT.n83 VOUT.n79 5.81868 +R1025 VOUT.n76 VOUT.n72 5.81868 +R1026 VOUT.n173 VOUT.n169 5.46391 +R1027 VOUT.n106 VOUT.n104 5.46391 +R1028 VOUT.n87 VOUT.n86 5.15639 +R1029 VOUT.n177 VOUT.n169 5.15172 +R1030 VOUT.n104 VOUT.n103 5.15172 +R1031 VOUT.n486 VOUT.n485 4.52733 +R1032 VOUT.n598 VOUT.n597 4.52733 +R1033 VOUT.n84 VOUT.n80 3.44771 +R1034 VOUT.n77 VOUT.n73 3.44771 +R1035 VOUT.n91 VOUT.n71 2.18587 +R1036 VOUT.n453 VOUT.n452 0.780988 +R1037 VOUT.n565 VOUT.n564 0.780988 +R1038 VOUT.n203 VOUT.n202 0.780988 +R1039 VOUT.n56 VOUT.n35 0.780988 +R1040 VOUT.n555 VOUT.n319 0.152939 +R1041 VOUT.n555 VOUT.n554 0.152939 +R1042 VOUT.n554 VOUT.n553 0.152939 +R1043 VOUT.n553 VOUT.n322 0.152939 +R1044 VOUT.n418 VOUT.n322 0.152939 +R1045 VOUT.n419 VOUT.n418 0.152939 +R1046 VOUT.n420 VOUT.n419 0.152939 +R1047 VOUT.n420 VOUT.n415 0.152939 +R1048 VOUT.n425 VOUT.n415 0.152939 +R1049 VOUT.n426 VOUT.n425 0.152939 +R1050 VOUT.n427 VOUT.n426 0.152939 +R1051 VOUT.n427 VOUT.n413 0.152939 +R1052 VOUT.n432 VOUT.n413 0.152939 +R1053 VOUT.n433 VOUT.n432 0.152939 +R1054 VOUT.n434 VOUT.n433 0.152939 +R1055 VOUT.n434 VOUT.n411 0.152939 +R1056 VOUT.n439 VOUT.n411 0.152939 +R1057 VOUT.n440 VOUT.n439 0.152939 +R1058 VOUT.n441 VOUT.n440 0.152939 +R1059 VOUT.n441 VOUT.n409 0.152939 +R1060 VOUT.n446 VOUT.n409 0.152939 +R1061 VOUT.n335 VOUT.n314 0.152939 +R1062 VOUT.n336 VOUT.n335 0.152939 +R1063 VOUT.n337 VOUT.n336 0.152939 +R1064 VOUT.n338 VOUT.n337 0.152939 +R1065 VOUT.n339 VOUT.n338 0.152939 +R1066 VOUT.n347 VOUT.n339 0.152939 +R1067 VOUT.n348 VOUT.n347 0.152939 +R1068 VOUT.n349 VOUT.n348 0.152939 +R1069 VOUT.n350 VOUT.n349 0.152939 +R1070 VOUT.n358 VOUT.n350 0.152939 +R1071 VOUT.n359 VOUT.n358 0.152939 +R1072 VOUT.n360 VOUT.n359 0.152939 +R1073 VOUT.n361 VOUT.n360 0.152939 +R1074 VOUT.n369 VOUT.n361 0.152939 +R1075 VOUT.n370 VOUT.n369 0.152939 +R1076 VOUT.n371 VOUT.n370 0.152939 +R1077 VOUT.n372 VOUT.n371 0.152939 +R1078 VOUT.n380 VOUT.n372 0.152939 +R1079 VOUT.n381 VOUT.n380 0.152939 +R1080 VOUT.n382 VOUT.n381 0.152939 +R1081 VOUT.n383 VOUT.n382 0.152939 +R1082 VOUT.n232 VOUT.n231 0.152939 +R1083 VOUT.n234 VOUT.n232 0.152939 +R1084 VOUT.n234 VOUT.n233 0.152939 +R1085 VOUT.n233 VOUT.n136 0.152939 +R1086 VOUT.n249 VOUT.n136 0.152939 +R1087 VOUT.n250 VOUT.n249 0.152939 +R1088 VOUT.n251 VOUT.n250 0.152939 +R1089 VOUT.n251 VOUT.n122 0.152939 +R1090 VOUT.n267 VOUT.n122 0.152939 +R1091 VOUT.n268 VOUT.n267 0.152939 +R1092 VOUT.n269 VOUT.n268 0.152939 +R1093 VOUT.n269 VOUT.n116 0.152939 +R1094 VOUT.n277 VOUT.n116 0.152939 +R1095 VOUT.n278 VOUT.n277 0.152939 +R1096 VOUT.n281 VOUT.n278 0.152939 +R1097 VOUT.n281 VOUT.n280 0.152939 +R1098 VOUT.n280 VOUT.n279 0.152939 +R1099 VOUT.n279 VOUT.n108 0.152939 +R1100 VOUT.n291 VOUT.n108 0.152939 +R1101 VOUT.n225 VOUT.n142 0.152939 +R1102 VOUT.n240 VOUT.n142 0.152939 +R1103 VOUT.n241 VOUT.n240 0.152939 +R1104 VOUT.n242 VOUT.n241 0.152939 +R1105 VOUT.n242 VOUT.n129 0.152939 +R1106 VOUT.n258 VOUT.n129 0.152939 +R1107 VOUT.n259 VOUT.n258 0.152939 +R1108 VOUT.n260 VOUT.n259 0.152939 +R1109 VOUT.n260 VOUT.n0 0.152939 +R1110 VBULK VOUT.n643 0.152939 +R1111 VOUT.n643 VOUT.n2 0.152939 +R1112 VOUT.n639 VOUT.n2 0.152939 +R1113 VOUT.n639 VOUT.n638 0.152939 +R1114 VOUT.n638 VOUT.n637 0.152939 +R1115 VOUT.n637 VOUT.n7 0.152939 +R1116 VOUT.n633 VOUT.n7 0.152939 +R1117 VOUT.n633 VOUT.n632 0.152939 +R1118 VOUT.n632 VOUT.n631 0.152939 +R1119 VBULK VOUT.n0 0.1255 +R1120 VOUT.n87 VOUT 0.07175 +R1121 VOUT.n89 VOUT.n88 0.0252093 +R1122 Ib.n3 Ib.n1 289.615 +R1123 Ib.n10 Ib.n8 289.615 +R1124 Ib.n4 Ib.n3 185 +R1125 Ib.n11 Ib.n10 185 +R1126 Ib.t0 Ib.n2 167.117 +R1127 Ib.t1 Ib.n9 167.117 +R1128 Ib.n15 Ib.n14 97.7613 +R1129 Ib.n15 Ib.n7 87.9624 +R1130 Ib.n0 Ib.t2 77.9525 +R1131 Ib.n0 Ib.t3 73.2951 +R1132 Ib.n3 Ib.t0 52.3082 +R1133 Ib.n10 Ib.t1 52.3082 +R1134 Ib Ib.n0 20.9423 +R1135 Ib.n4 Ib.n2 9.71174 +R1136 Ib.n11 Ib.n9 9.71174 +R1137 Ib.n7 Ib.n6 9.45567 +R1138 Ib.n14 Ib.n13 9.45567 +R1139 Ib.n6 Ib.n5 9.3005 +R1140 Ib.n13 Ib.n12 9.3005 +R1141 Ib.n7 Ib.n1 8.14595 +R1142 Ib.n14 Ib.n8 8.14595 +R1143 Ib.n5 Ib.n4 7.3702 +R1144 Ib.n12 Ib.n11 7.3702 +R1145 Ib.n5 Ib.n1 5.81868 +R1146 Ib.n12 Ib.n8 5.81868 +R1147 Ib Ib.n15 5.27074 +R1148 Ib.n6 Ib.n2 3.44771 +R1149 Ib.n13 Ib.n9 3.44771 +R1150 VIN.n0 VIN.t1 81.8275 +R1151 VIN.n0 VIN.t0 69.7713 +R1152 VIN VIN.n0 0.0149903 +C0 VIN Ib 0.696867f +C1 Ib VOUT 11.6612f +C2 VIN VOUT 3.87686f +.ends + diff --git a/src/glayout/blocks/elementary/FVF/physical_features.py b/src/glayout/blocks/elementary/FVF/physical_features.py deleted file mode 100644 index 2c32978d..00000000 --- a/src/glayout/blocks/elementary/FVF/physical_features.py +++ /dev/null @@ -1,111 +0,0 @@ -# physical_features.py -import os -import re -import subprocess -import shutil -from pathlib import Path -from gdsfactory.typings import Component -from gdsfactory.geometry.boolean import boolean - -def calculate_area(component: Component) -> float: - """Calculates the area of a gdsfactory Component.""" - return float(component.area()) - -def _mirror_and_xor(component: Component, axis: str) -> float: - """Helper to perform mirroring and XOR for symmetry calculation.""" - # --- Operate on a copy to prevent modifying the original --- - comp_copy = component.copy() - comp_copy.unlock() - - mirrored_ref = comp_copy.copy() - if axis == 'vertical': - mirrored_ref = mirrored_ref.mirror((0, -100), (0, 100)) - elif axis == 'horizontal': - mirrored_ref = mirrored_ref.mirror((-100, 0), (100, 0)) - else: - return 0.0 - - # Pass the copies to the boolean operation - asymmetry_layout = boolean(A=comp_copy, B=mirrored_ref, operation="xor") - return float(asymmetry_layout.area()) - -def calculate_symmetry_scores(component: Component) -> tuple[float, float]: - """Calculates horizontal and vertical symmetry scores (1.0 = perfect symmetry).""" - original_area = calculate_area(component) - if original_area == 0: - return (1.0, 1.0) - - asymmetry_y_area = _mirror_and_xor(component, 'horizontal') - asymmetry_x_area = _mirror_and_xor(component, 'vertical') - - symmetry_score_horizontal = 1.0 - (asymmetry_x_area / original_area) - symmetry_score_vertical = 1.0 - (asymmetry_y_area / original_area) - return symmetry_score_horizontal, symmetry_score_vertical - -def _parse_simple_parasitics(component_name: str) -> tuple[float, float]: - """Parses total parasitic R and C from a SPICE file by simple summation.""" - total_resistance = 0.0 - total_capacitance = 0.0 - spice_file_path = f"{component_name}_pex.spice" - if not os.path.exists(spice_file_path): - return 0.0, 0.0 - with open(spice_file_path, 'r') as f: - for line in f: - line = line.strip().upper() - parts = line.split() - if not parts: continue - - name = parts[0] - if name.startswith('R') and len(parts) >= 4: - try: total_resistance += float(parts[3]) - except (ValueError): continue - elif name.startswith('C') and len(parts) >= 4: - try: - cap_str = parts[3] - unit = cap_str[-1] - val_str = cap_str[:-1] - if unit == 'F': cap_value = float(val_str) * 1e-15 - elif unit == 'P': cap_value = float(val_str) * 1e-12 - elif unit == 'N': cap_value = float(val_str) * 1e-9 - elif unit == 'U': cap_value = float(val_str) * 1e-6 - else: cap_value = float(cap_str) - total_capacitance += cap_value - except (ValueError): continue - return total_resistance, total_capacitance - -def run_physical_feature_extraction(layout_path: str, component_name: str, top_level: Component) -> dict: - """ - Runs PEX and calculates geometric features, returning a structured result. - """ - physical_results = { - "pex": {"status": "not run", "total_resistance_ohms": 0.0, "total_capacitance_farads": 0.0}, - "geometric": {"raw_area_um2": 0.0, "symmetry_score_horizontal": 0.0, "symmetry_score_vertical": 0.0} - } - - # PEX and Parasitics - try: - pex_spice_path = f"{component_name}_pex.spice" - if os.path.exists(pex_spice_path): - os.remove(pex_spice_path) - subprocess.run(["./run_pex.sh", layout_path, component_name], check=True, capture_output=True, text=True) - physical_results["pex"]["status"] = "PEX Complete" - total_res, total_cap = _parse_simple_parasitics(component_name) - physical_results["pex"]["total_resistance_ohms"] = total_res - physical_results["pex"]["total_capacitance_farads"] = total_cap - except subprocess.CalledProcessError as e: - physical_results["pex"]["status"] = f"PEX Error: {e.stderr}" - except FileNotFoundError: - physical_results["pex"]["status"] = "PEX Error: run_pex.sh not found." - except Exception as e: - physical_results["pex"]["status"] = f"PEX Unexpected Error: {e}" - - # Geometric Features - try: - physical_results["geometric"]["raw_area_um2"] = calculate_area(top_level) - sym_h, sym_v = calculate_symmetry_scores(top_level) - physical_results["geometric"]["symmetry_score_horizontal"] = sym_h - physical_results["geometric"]["symmetry_score_vertical"] = sym_v - except Exception as e: - print(f"Warning: Could not calculate geometric features. Error: {e}") - - return physical_results \ No newline at end of file diff --git a/src/glayout/blocks/elementary/FVF/run_pex.sh b/src/glayout/blocks/elementary/FVF/run_pex.sh deleted file mode 100755 index e7a32fd6..00000000 --- a/src/glayout/blocks/elementary/FVF/run_pex.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Usage: ./run_pex.sh layout.gds layout_cell_name - -GDS_FILE=$1 -LAYOUT_CELL=$2 - -magic -rcfile ./sky130A.magicrc -noconsole -dnull << EOF -gds read $GDS_FILE -flatten $LAYOUT_CELL -load $LAYOUT_CELL -select top cell -extract do local -extract all -ext2sim labels on -ext2sim -extresist tolerance 10 -extresist -ext2spice lvs -ext2spice cthresh 0 -ext2spice extresist on -ext2spice -o ${LAYOUT_CELL}_pex.spice -exit -EOF \ No newline at end of file diff --git a/src/glayout/blocks/elementary/FVF/sky130A.magicrc b/src/glayout/blocks/elementary/FVF/sky130A.magicrc deleted file mode 100644 index 9bb1dbd6..00000000 --- a/src/glayout/blocks/elementary/FVF/sky130A.magicrc +++ /dev/null @@ -1,86 +0,0 @@ -puts stdout "Sourcing design .magicrc for technology sky130A ..." - -# Put grid on 0.005 pitch. This is important, as some commands don't -# rescale the grid automatically (such as lef read?). - -set scalefac [tech lambda] -if {[lindex $scalefac 1] < 2} { - scalegrid 1 2 -} - -# drc off -drc euclidean on -# Change this to a fixed number for repeatable behavior with GDS writes -# e.g., "random seed 12345" -catch {random seed} - -# Turn off the scale option on ext2spice or else it conflicts with the -# scale in the model files. -ext2spice scale off - -# Allow override of PDK path from environment variable PDKPATH -if {[catch {set PDKPATH $env(PDKPATH)}]} { - set PDKPATH $env(PDK_ROOT)/sky130A -} - -# loading technology -tech load $PDKPATH/libs.tech/magic/sky130A.tech - -# load device generator -source $PDKPATH/libs.tech/magic/sky130A.tcl - -# load bind keys (optional) -# source $PDKPATH/libs.tech/magic/sky130A-BindKeys - -# set units to lambda grid -snap lambda - -# set sky130 standard power, ground, and substrate names -set VDD VPWR -set GND VGND -set SUB VSUBS - -# Allow override of type of magic library views used, "mag" or "maglef", -# from environment variable MAGTYPE - -if {[catch {set MAGTYPE $env(MAGTYPE)}]} { - set MAGTYPE mag -} - -# add path to reference cells -if {[file isdir ${PDKPATH}/libs.ref/${MAGTYPE}]} { - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_pr - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_io - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hd - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hdll - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hs - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_hvl - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_lp - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_ls - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_fd_sc_ms - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_osu_sc - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_osu_sc_t18 - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_ml_xx_hd - addpath ${PDKPATH}/libs.ref/${MAGTYPE}/sky130_sram_macros -} else { - addpath ${PDKPATH}/libs.ref/sky130_fd_pr/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_io/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hd/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hdll/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hs/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_hvl/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_lp/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_ls/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_fd_sc_ms/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_osu_sc/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_osu_sc_t18/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_ml_xx_hd/${MAGTYPE} - addpath ${PDKPATH}/libs.ref/sky130_sram_macros/${MAGTYPE} -} - -# add path to GDS cells - -# add path to IP from catalog. This procedure defined in the PDK script. -catch {magic::query_mylib_ip} -# add path to local IP from user design space. Defined in the PDK script. -catch {magic::query_my_projects} diff --git a/src/glayout/blocks/elementary/FVF/verification.py b/src/glayout/blocks/elementary/FVF/verification.py deleted file mode 100644 index 54cebe35..00000000 --- a/src/glayout/blocks/elementary/FVF/verification.py +++ /dev/null @@ -1,174 +0,0 @@ -# verification.py -import os -import re -import subprocess -import shutil -import tempfile -import sys -from pathlib import Path -from glayout.pdk.sky130_mapped import sky130_mapped_pdk -from gdsfactory.typings import Component - -def parse_drc_report(report_content: str) -> dict: - """ - Parses a Magic DRC report into a machine-readable format. - """ - errors = [] - current_rule = "" - for line in report_content.strip().splitlines(): - stripped_line = line.strip() - if stripped_line == "----------------------------------------": - continue - if re.match(r"^[a-zA-Z]", stripped_line): - current_rule = stripped_line - elif re.match(r"^[0-9]", stripped_line): - errors.append({"rule": current_rule, "details": stripped_line}) - - is_pass = len(errors) == 0 - if not is_pass and re.search(r"count:\s*0\s*$", report_content, re.IGNORECASE): - is_pass = True - - return { - "is_pass": is_pass, - "total_errors": len(errors), - "error_details": errors - } - -def parse_lvs_report(report_content: str) -> dict: - """ - Parses the raw netgen LVS report and returns a summarized, machine-readable format. - Focuses on parsing net and instance mismatches. - """ - summary = { - "is_pass": False, - "conclusion": "LVS failed or report was inconclusive.", - "total_mismatches": 0, - "mismatch_details": { - "nets": "Not found", - "devices": "Not found", - "unmatched_nets_parsed": [], - "unmatched_instances_parsed": [] - } - } - - # Primary check for LVS pass/fail - if "Netlists match" in report_content or "Circuits match uniquely" in report_content: - summary["is_pass"] = True - summary["conclusion"] = "LVS Pass: Netlists match." - elif "Netlist mismatch" in report_content or "Netlists do not match" in report_content: - summary["conclusion"] = "LVS Fail: Netlist mismatch." - - for line in report_content.splitlines(): - line = line.strip() - - # Parse net mismatches - net_mismatch_match = re.search(r"Net:\s*([^\|]+)\s*\|\s*\((no matching net)\)", line) - if net_mismatch_match: - name_left = net_mismatch_match.group(1).strip() - # If name is on the left, it's in layout, missing in schematic - summary["mismatch_details"]["unmatched_nets_parsed"].append({ - "type": "net", - "name": name_left, - "present_in": "layout", - "missing_in": "schematic" - }) - continue - - # Parse instance mismatches - instance_mismatch_match = re.search(r"Instance:\s*([^\|]+)\s*\|\s*\((no matching instance)\)", line) - if instance_mismatch_match: - name_left = instance_mismatch_match.group(1).strip() - # If name is on the left, it's in layout, missing in schematic - summary["mismatch_details"]["unmatched_instances_parsed"].append({ - "type": "instance", - "name": name_left, - "present_in": "layout", - "missing_in": "schematic" - }) - continue - - # Also capture cases where something is present in schematic but missing in layout (right side of '|') - net_mismatch_right_match = re.search(r"\s*\|\s*([^\|]+)\s*\((no matching net)\)", line) - if net_mismatch_right_match: - name_right = net_mismatch_right_match.group(1).strip() - # If name is on the right, it's in schematic, missing in layout - summary["mismatch_details"]["unmatched_nets_parsed"].append({ - "type": "net", - "name": name_right, - "present_in": "schematic", - "missing_in": "layout" - }) - continue - - instance_mismatch_right_match = re.search(r"\s*\|\s*([^\|]+)\s*\((no matching instance)\)", line) - if instance_mismatch_right_match: - name_right = instance_mismatch_right_match.group(1).strip() - # If name is on the right, it's in schematic, missing in layout - summary["mismatch_details"]["unmatched_instances_parsed"].append({ - "type": "instance", - "name": name_right, - "present_in": "schematic", - "missing_in": "layout" - }) - continue - - # Capture summary lines like "Number of devices:" and "Number of nets:" - if "Number of devices:" in line: - summary["mismatch_details"]["devices"] = line.split(":", 1)[1].strip() if ":" in line else line - elif "Number of nets:" in line: - summary["mismatch_details"]["nets"] = line.split(":", 1)[1].strip() if ":" in line else line - - # Calculate total mismatches - summary["total_mismatches"] = len(summary["mismatch_details"]["unmatched_nets_parsed"]) + \ - len(summary["mismatch_details"]["unmatched_instances_parsed"]) - - # If there are any mismatches found, then LVS fails, regardless of "Netlists match" string. - if summary["total_mismatches"] > 0: - summary["is_pass"] = False - if "LVS Pass" in summary["conclusion"]: # If conclusion still says pass, update it - summary["conclusion"] = "LVS Fail: Mismatches found." - - return summary - -def run_verification(layout_path: str, component_name: str, top_level: Component) -> dict: - """ - Runs DRC and LVS checks and returns a structured result dictionary. - """ - verification_results = { - "drc": {"status": "not run", "is_pass": False, "report_path": None, "summary": {}}, - "lvs": {"status": "not run", "is_pass": False, "report_path": None, "summary": {}} - } - - # DRC Check - drc_report_path = os.path.abspath(f"./{component_name}.drc.rpt") - verification_results["drc"]["report_path"] = drc_report_path - try: - if os.path.exists(drc_report_path): - os.remove(drc_report_path) - sky130_mapped_pdk.drc_magic(layout_path, component_name, output_file=drc_report_path) - report_content = "" - if os.path.exists(drc_report_path): - with open(drc_report_path, 'r') as f: - report_content = f.read() - summary = parse_drc_report(report_content) - verification_results["drc"].update({"summary": summary, "is_pass": summary["is_pass"], "status": "pass" if summary["is_pass"] else "fail"}) - except Exception as e: - verification_results["drc"]["status"] = f"error: {e}" - - # LVS Check - lvs_report_path = os.path.abspath(f"./{component_name}.lvs.rpt") - verification_results["lvs"]["report_path"] = lvs_report_path - try: - if os.path.exists(lvs_report_path): - os.remove(lvs_report_path) - sky130_mapped_pdk.lvs_netgen(layout=top_level, design_name=component_name, output_file_path=lvs_report_path) - report_content = "" - if os.path.exists(lvs_report_path): - with open(lvs_report_path, 'r') as report_file: - report_content = report_file.read() - lvs_summary = parse_lvs_report(report_content) - verification_results["lvs"].update({"summary": lvs_summary, "is_pass": lvs_summary["is_pass"], "status": "pass" if lvs_summary["is_pass"] else "fail"}) - except Exception as e: - verification_results["lvs"]["status"] = f"error: {e}" - - return verification_results \ No newline at end of file diff --git a/src/glayout/blocks/elementary/current_mirror/current_mirror.py b/src/glayout/blocks/elementary/current_mirror/current_mirror.py index 1006de66..054c11a4 100644 --- a/src/glayout/blocks/elementary/current_mirror/current_mirror.py +++ b/src/glayout/blocks/elementary/current_mirror/current_mirror.py @@ -1,54 +1,56 @@ -from glayout import MappedPDK, sky130,gf180 -from glayout.routing import c_route,L_route,straight_route -from glayout.spice.netlist import Netlist from glayout.placement.two_transistor_interdigitized import two_nfet_interdigitized, two_pfet_interdigitized +from glayout.pdk.mappedpdk import MappedPDK +from glayout.routing.c_route import c_route +from glayout.routing.L_route import L_route +from glayout.routing.straight_route import straight_route from glayout.spice.netlist import Netlist +from glayout.pdk.sky130_mapped import sky130_mapped_pdk as sky130 from glayout.primitives.fet import nmos, pmos from glayout.primitives.guardring import tapring -from glayout.util.port_utils import add_ports_perimeter,rename_ports_by_orientation +from glayout.util.port_utils import add_ports_perimeter, rename_ports_by_orientation from gdsfactory.component import Component from gdsfactory.cell import cell from glayout.util.comp_utils import evaluate_bbox, prec_center, prec_ref_center, align_comp_to_port from typing import Optional, Union +from glayout.pdk.sky130_mapped import sky130_mapped_pdk from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle try: - from evaluator_wrapper import run_evaluation + from glayout.blocks.evaluator_box.evaluator_wrapper import run_evaluation except ImportError: print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") run_evaluation = None -def sky130_add_cm_labels(cm_in: Component) -> Component: +def add_cm_labels(cm_in: Component, + pdk: MappedPDK + ) -> Component: cm_in.unlock() - - # define layers` - met1_pin = (68,16) - met1_label = (68,5) - met2_pin = (69,16) - met2_label = (69,5) + met2_pin = (68,16) + met2_label = (68,5) + # list that will contain all port/comp info move_info = list() # create labels and append to info list # vss - vsslabel = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vsslabel.add_label(text="VSS",layer=met1_label) + vsslabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vsslabel.add_label(text="VSS",layer=pdk.get_glayer("met2_label")) move_info.append((vsslabel,cm_in.ports["fet_A_source_E"],None)) # vref - vreflabel = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vreflabel.add_label(text="VREF",layer=met1_label) + vreflabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vreflabel.add_label(text="VREF",layer=pdk.get_glayer("met2_label")) move_info.append((vreflabel,cm_in.ports["fet_A_drain_N"],None)) # vcopy - vcopylabel = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vcopylabel.add_label(text="VCOPY",layer=met1_label) + vcopylabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vcopylabel.add_label(text="VCOPY",layer=pdk.get_glayer("met2_label")) move_info.append((vcopylabel,cm_in.ports["fet_B_drain_N"],None)) # VB - vblabel = rectangle(layer=met1_pin,size=(0.5,0.5),centered=True).copy() - vblabel.add_label(text="VB",layer=met1_label) + vblabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.5,0.5),centered=True).copy() + vblabel.add_label(text="VB",layer=pdk.get_glayer("met2_label")) move_info.append((vblabel,cm_in.ports["welltie_S_top_met_S"], None)) # move everything to position @@ -63,7 +65,7 @@ def current_mirror_netlist( width: float, length: float, multipliers: int, - with_dummy: Optional[bool] = False, + with_dummy: bool = True, n_or_p_fet: Optional[str] = 'nfet', subckt_only: Optional[bool] = False ) -> Netlist: @@ -97,7 +99,7 @@ def current_mirror_netlist( ) -@cell +#@cell def current_mirror( pdk: MappedPDK, numcols: int = 3, @@ -158,10 +160,10 @@ def current_mirror( if device in ['pmos','pfet']: tap_layer = "n+s/d" tap_sep = max( - pdk.util_max_metal_seperation(), - pdk.get_grule("active_diff", "active_tap")["min_separation"], + float(pdk.util_max_metal_seperation()), + float(pdk.get_grule("active_diff", "active_tap")["min_separation"]), ) - tap_sep += pdk.get_grule(tap_layer, "active_tap")["min_enclosure"] + tap_sep += float(pdk.get_grule(tap_layer, "active_tap")["min_enclosure"]) tap_encloses = ( 2 * (tap_sep + interdigitized_fets.xmax), 2 * (tap_sep + interdigitized_fets.ymax), @@ -210,121 +212,12 @@ def current_mirror( ) return top_level - - -def sky130_add_current_mirror_labels(current_mirror_in: Component) -> Component: - """ - Add labels to current mirror component for simulation and testing - """ - current_mirror_in.unlock() - # define layers - met1_pin = (68,16) - met1_label = (68,5) - met2_pin = (69,16) - met2_label = (69,5) - # list that will contain all port/comp info - move_info = list() - - # Reference voltage (drain of reference transistor) - vref_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vref_label.add_label(text="VREF", layer=met1_label) - - # Copy current output (drain of mirror transistor) - vcopy_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vcopy_label.add_label(text="VCOPY", layer=met1_label) - - # Ground/VSS (source connections) - vss_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vss_label.add_label(text="VSS", layer=met1_label) - - # Bulk/VB (bulk/body connections) - vb_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vb_label.add_label(text="VB", layer=met1_label) - - # Try to find appropriate ports and add labels - try: - # Look for drain ports for VREF and VCOPY - ref_drain_ports = [p for p in current_mirror_in.ports.keys() if 'A_drain' in p and 'met' in p] - copy_drain_ports = [p for p in current_mirror_in.ports.keys() if 'B_drain' in p and 'met' in p] - source_ports = [p for p in current_mirror_in.ports.keys() if 'source' in p and 'met' in p] - bulk_ports = [p for p in current_mirror_in.ports.keys() if ('tie' in p or 'well' in p) and 'met' in p] - - if ref_drain_ports: - move_info.append((vref_label, current_mirror_in.ports[ref_drain_ports[0]], None)) - if copy_drain_ports: - move_info.append((vcopy_label, current_mirror_in.ports[copy_drain_ports[0]], None)) - if source_ports: - move_info.append((vss_label, current_mirror_in.ports[source_ports[0]], None)) - if bulk_ports: - move_info.append((vb_label, current_mirror_in.ports[bulk_ports[0]], None)) - - except (KeyError, IndexError): - # Fallback - just add labels at component center - print("Warning: Could not find specific ports for labels, using fallback positioning") - move_info = [ - (vref_label, None, None), - (vcopy_label, None, None), - (vss_label, None, None), - (vb_label, None, None) - ] - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - if prt is not None: - compref = align_comp_to_port(comp, prt, alignment=alignment) - else: - compref = comp - current_mirror_in.add(compref) - - return current_mirror_in.flatten() - - -# Create and evaluate a current mirror instance -if __name__ == "__main__": - # OLD EVAL CODE - # comp = current_mirror(sky130) - # # comp.pprint_ports() - # comp = add_cm_labels(comp,sky130) - # comp.name = "CM" - # comp.show() - # #print(comp.info['netlist'].generate_netlist()) - # print("...Running DRC...") - # drc_result = sky130.drc_magic(comp, "CM") - # ## Klayout DRC - # #drc_result = sky130.drc(comp)\n - - # time.sleep(5) - - # print("...Running LVS...") - # lvs_res=sky130.lvs_netgen(comp, "CM") - # #print("...Saving GDS...") - # #comp.write_gds('out_CMirror.gds') - - # NEW EVAL CODE - # Create current mirror with labels - cm = sky130_add_current_mirror_labels( - current_mirror( - pdk=sky130, - numcols=3, - device='nfet', - width=3, - length=1, - with_dummy=True, - with_tie=True - ) - ) - - # Show the layout - cm.show() - cm.name = "current_mirror" - - # Write GDS file - cm_gds = cm.write_gds("current_mirror.gds") - # Run evaluation if available - if run_evaluation is not None: - result = run_evaluation("current_mirror.gds", cm.name, cm) - print(result) - else: - print("Evaluation skipped - evaluator_wrapper not available") +if __name__=="__main__": + current_mirror = add_cm_labels(current_mirror(sky130_mapped_pdk, device='pfet'),sky130_mapped_pdk) + current_mirror.show() + current_mirror.name = "CMIRROR" + #magic_drc_result = sky130_mapped_pdk.drc_magic(current_mirror, current_mirror.name) + #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(current_mirror, current_mirror.name) + current_mirror_gds = current_mirror.write_gds("current_mirror.gds") + res = run_evaluation("current_mirror.gds", current_mirror.name, current_mirror) \ No newline at end of file diff --git a/src/glayout/blocks/elementary/diff_pair/diff_pair.py b/src/glayout/blocks/elementary/diff_pair/diff_pair.py index 26b63acd..759e5695 100644 --- a/src/glayout/blocks/elementary/diff_pair/diff_pair.py +++ b/src/glayout/blocks/elementary/diff_pair/diff_pair.py @@ -1,7 +1,4 @@ from typing import Optional, Union -from glayout import MappedPDK, sky130,gf180 -from glayout.spice.netlist import Netlist -from glayout.routing import c_route,L_route,straight_route from gdsfactory.cell import cell from gdsfactory.component import Component, copy @@ -23,192 +20,80 @@ from glayout.primitives.fet import nmos, pmos from glayout.primitives.guardring import tapring from glayout.primitives.via_gen import via_stack +from glayout.routing.c_route import c_route from glayout.routing.smart_route import smart_route +from glayout.routing.straight_route import straight_route from glayout.spice import Netlist from glayout.pdk.sky130_mapped import sky130_mapped_pdk from gdsfactory.components import text_freetype try: - from evaluator_wrapper import run_evaluation + from glayout.blocks.evaluator_box.evaluator_wrapper import run_evaluation except ImportError: print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") run_evaluation = None -def sky130_add_df_labels(df_in: Component) -> Component: +def add_df_labels(df_in: Component, + pdk: MappedPDK + ) -> Component: - df_in.unlock() - - # define layers` - met1_pin = (68,16) - met1_label = (68,5) - li1_pin = (67,16) - li1_label = (67,5) + df_in.unlock() + met1_pin = (67,16) + met1_label = (67,5) + met2_pin = (68,16) + met2_label = (68,5) # list that will contain all port/comp info - move_info = list() + move_info = list() # create labels and append to info list # vtail - vtaillabel = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vtaillabel.add_label(text="VTAIL",layer=met1_label) - move_info.append((vtaillabel,df_in.ports["bl_multiplier_0_source_S"],None)) + vtaillabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vtaillabel.add_label(text="VTAIL",layer=pdk.get_glayer("met2_label")) + move_info.append((vtaillabel,df_in.ports["bl_multiplier_0_source_S"],None)) # vdd1 - vdd1label = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vdd1label.add_label(text="VDD1",layer=met1_label) - move_info.append((vdd1label,df_in.ports["tl_multiplier_0_drain_N"],None)) + vdd1label = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vdd1label.add_label(text="VDD1",layer=pdk.get_glayer("met2_label")) + move_info.append((vdd1label,df_in.ports["tl_multiplier_0_drain_N"],None)) # vdd2 - vdd2label = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vdd2label.add_label(text="VDD2",layer=met1_label) - move_info.append((vdd2label,df_in.ports["tr_multiplier_0_drain_N"],None)) + vdd2label = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vdd2label.add_label(text="VDD2",layer=pdk.get_glayer("met2_label")) + move_info.append((vdd2label,df_in.ports["tr_multiplier_0_drain_N"],None)) # VB - vblabel = rectangle(layer=li1_pin,size=(0.5,0.5),centered=True).copy() - vblabel.add_label(text="B",layer=li1_label) - move_info.append((vblabel,df_in.ports["tap_N_top_met_S"], None)) + vblabel = rectangle(layer=pdk.get_glayer("met1_pin"),size=(0.5,0.5),centered=True).copy() + vblabel.add_label(text="B",layer=pdk.get_glayer("met1_label")) + move_info.append((vblabel,df_in.ports["tap_N_top_met_S"], None)) # VP - vplabel = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vplabel.add_label(text="VP",layer=met1_label) - move_info.append((vplabel,df_in.ports["br_multiplier_0_gate_S"], None)) + vplabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vplabel.add_label(text="VP",layer=pdk.get_glayer("met2_label")) + move_info.append((vplabel,df_in.ports["br_multiplier_0_gate_S"], None)) # VN - vnlabel = rectangle(layer=met1_pin,size=(0.27,0.27),centered=True).copy() - vnlabel.add_label(text="VN",layer=met1_label) - move_info.append((vnlabel,df_in.ports["bl_multiplier_0_gate_S"], None)) + vnlabel = rectangle(layer=pdk.get_glayer("met2_pin"),size=(0.27,0.27),centered=True).copy() + vnlabel.add_label(text="VN",layer=pdk.get_glayer("met2_label")) + move_info.append((vnlabel,df_in.ports["bl_multiplier_0_gate_S"], None)) # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - compref = align_comp_to_port(comp, prt, alignment=alignment) - df_in.add(compref) - return df_in.flatten() + for comp, prt, alignment in move_info: + alignment = ('c','b') if alignment is None else alignment + compref = align_comp_to_port(comp, prt, alignment=alignment) + df_in.add(compref) + return df_in.flatten() def diff_pair_netlist(fetL: Component, fetR: Component) -> Netlist: diff_pair_netlist = Netlist(circuit_name='DIFF_PAIR', nodes=['VP', 'VN', 'VDD1', 'VDD2', 'VTAIL', 'B']) - - # Handle fetL netlist - reconstruct if it's a string - fetL_netlist = fetL.info['netlist'] - if isinstance(fetL_netlist, str): - if 'netlist_data' in fetL.info: - data = fetL.info['netlist_data'] - fetL_netlist = Netlist(circuit_name=data['circuit_name'], nodes=data['nodes']) - fetL_netlist.source_netlist = data['source_netlist'] - if 'parameters' in data: - fetL_netlist.parameters = data['parameters'] - else: - raise ValueError("No netlist_data found for string netlist in fetL component.info") - - # Handle fetR netlist - reconstruct if it's a string - fetR_netlist = fetR.info['netlist'] - if isinstance(fetR_netlist, str): - if 'netlist_data' in fetR.info: - data = fetR.info['netlist_data'] - fetR_netlist = Netlist(circuit_name=data['circuit_name'], nodes=data['nodes']) - fetR_netlist.source_netlist = data['source_netlist'] - if 'parameters' in data: - fetR_netlist.parameters = data['parameters'] - else: - raise ValueError("No netlist_data found for string netlist in fetR component.info") - diff_pair_netlist.connect_netlist( - fetL_netlist, + fetL.info['netlist'], [('D', 'VDD1'), ('G', 'VP'), ('S', 'VTAIL'), ('B', 'B')] ) diff_pair_netlist.connect_netlist( - fetR_netlist, + fetR.info['netlist'], [('D', 'VDD2'), ('G', 'VN'), ('S', 'VTAIL'), ('B', 'B')] ) return diff_pair_netlist -def sky130_add_diff_pair_labels(diff_pair_in: Component) -> Component: - """ - Add labels to differential pair component for simulation and testing - """ - diff_pair_in.unlock() - # define layers - met1_pin = (68,16) - met1_label = (68,5) - met2_pin = (69,16) - met2_label = (69,5) - # list that will contain all port/comp info - move_info = list() - - # Positive input (VP) - vp_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vp_label.add_label(text="VP", layer=met1_label) - - # Negative input (VN) - vn_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vn_label.add_label(text="VN", layer=met1_label) - - # Positive output drain (VDD1) - vdd1_label = rectangle(layer=met2_pin, size=(0.5,0.5), centered=True).copy() - vdd1_label.add_label(text="VDD1", layer=met2_label) - - # Negative output drain (VDD2) - vdd2_label = rectangle(layer=met2_pin, size=(0.5,0.5), centered=True).copy() - vdd2_label.add_label(text="VDD2", layer=met2_label) - - # Tail current (VTAIL) - vtail_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - vtail_label.add_label(text="VTAIL", layer=met1_label) - - # Bulk/Body (B) - b_label = rectangle(layer=met1_pin, size=(0.5,0.5), centered=True).copy() - b_label.add_label(text="B", layer=met1_label) - - # Try to find appropriate ports and add labels - try: - # Look for gate ports for VP and VN - plus_gate_ports = [p for p in diff_pair_in.ports.keys() if 'PLUSgate' in p and 'met' in p] - minus_gate_ports = [p for p in diff_pair_in.ports.keys() if 'MINUSgate' in p and 'met' in p] - - # Look for drain ports for VDD1 and VDD2 - drain_ports = [p for p in diff_pair_in.ports.keys() if 'drain_route' in p and 'met' in p] - - # Look for source ports for VTAIL - source_ports = [p for p in diff_pair_in.ports.keys() if 'source_route' in p and 'met' in p] - - # Look for bulk/tie ports - bulk_ports = [p for p in diff_pair_in.ports.keys() if ('tie' in p or 'well' in p or 'tap' in p) and 'met' in p] - - if plus_gate_ports: - move_info.append((vp_label, diff_pair_in.ports[plus_gate_ports[0]], None)) - if minus_gate_ports: - move_info.append((vn_label, diff_pair_in.ports[minus_gate_ports[0]], None)) - if len(drain_ports) >= 2: - move_info.append((vdd1_label, diff_pair_in.ports[drain_ports[0]], None)) - move_info.append((vdd2_label, diff_pair_in.ports[drain_ports[1]], None)) - elif len(drain_ports) == 1: - move_info.append((vdd1_label, diff_pair_in.ports[drain_ports[0]], None)) - if source_ports: - move_info.append((vtail_label, diff_pair_in.ports[source_ports[0]], None)) - if bulk_ports: - move_info.append((b_label, diff_pair_in.ports[bulk_ports[0]], None)) - - except (KeyError, IndexError): - # Fallback - just add labels at component center - print("Warning: Could not find specific ports for labels, using fallback positioning") - move_info = [ - (vp_label, None, None), - (vn_label, None, None), - (vdd1_label, None, None), - (vdd2_label, None, None), - (vtail_label, None, None), - (b_label, None, None) - ] - - # move everything to position - for comp, prt, alignment in move_info: - alignment = ('c','b') if alignment is None else alignment - if prt is not None: - compref = align_comp_to_port(comp, prt, alignment=alignment) - else: - compref = comp - diff_pair_in.add(compref) - - return diff_pair_in.flatten() - @cell def diff_pair( pdk: MappedPDK, @@ -257,10 +142,10 @@ def diff_pair( a_topl = (diffpair << fetL).movey(fetL.ymax+min_spacing_y/2+0.5).movex(0-fetL.xmax-min_spacing_x/2) b_topr = (diffpair << fetR).movey(fetR.ymax+min_spacing_y/2+0.5).movex(fetL.xmax+min_spacing_x/2) a_botr = (diffpair << fetR) - a_botr.mirror_y() + a_botr = a_botr.mirror_y() a_botr.movey(0-0.5-fetL.ymax-min_spacing_y/2).movex(fetL.xmax+min_spacing_x/2) b_botl = (diffpair << fetL) - b_botl.mirror_y() + b_botl = b_botl.mirror_y() b_botl.movey(0-0.5-fetR.ymax-min_spacing_y/2).movex(0-fetL.xmax-min_spacing_x/2) # if substrate tap place substrate tap if substrate_tap: @@ -286,8 +171,8 @@ def diff_pair( diffpair << route_quad(a_topl.ports["multiplier_0_source_E"], b_topr.ports["multiplier_0_source_W"], layer=pdk.get_glayer("met2")) diffpair << route_quad(b_botl.ports["multiplier_0_source_E"], a_botr.ports["multiplier_0_source_W"], layer=pdk.get_glayer("met2")) sextension = b_topr.ports["well_E"].center[0] - b_topr.ports["multiplier_0_source_E"].center[0] - source_routeE = diffpair << c_route(pdk, b_topr.ports["multiplier_0_source_E"], a_botr.ports["multiplier_0_source_E"],extension=sextension) - source_routeW = diffpair << c_route(pdk, a_topl.ports["multiplier_0_source_W"], b_botl.ports["multiplier_0_source_W"],extension=sextension) + source_routeE = diffpair << c_route(pdk, b_topr.ports["multiplier_0_source_E"], a_botr.ports["multiplier_0_source_E"],extension=sextension, viaoffset=False) + source_routeW = diffpair << c_route(pdk, a_topl.ports["multiplier_0_source_W"], b_botl.ports["multiplier_0_source_W"],extension=sextension, viaoffset=False) # route drains # place via at the drain drain_br_via = diffpair << viam2m3 @@ -361,50 +246,12 @@ def diff_pair_generic( diffpair << smart_route(pdk,diffpair.ports["A_source_E"],diffpair.ports["B_source_E"],diffpair, diffpair) return diffpair - -# Create and evaluate a differential pair instance -if __name__ == "__main__": - # this is the old eval code - - # Create differential pair with labels - comp =diff_pair(sky130) - # comp.pprint_ports() - comp=sky130_add_df_labels(comp) - comp.name = "DiffPair" - comp.show() - #print(comp.info['netlist'].generate_netlist()) - print("...Running DRC...") - drc_result = sky130.drc_magic(comp, "DiffPair") - ## Klayout DRC - #drc_result = sky130.drc(comp)\n - time.sleep(5) - print("...Running LVS...") - lvs_res=sky130.lvs_netgen(comp, "DiffPair") - #print("...Saving GDS...") - #comp.write_gds('out_Diffpair.gds') - - # This is the new eval code - dp = sky130_add_diff_pair_labels( - diff_pair( - pdk=sky130, - width=3, - fingers=4, - length=None, - n_or_p_fet=True, - plus_minus_seperation=0, - rmult=1, - dummy=True, - substrate_tap=True - ) - ) - # Show the layout - dp.show() - dp.name = "diff_pair" - # Write GDS file - dp_gds = dp.write_gds("diff_pair.gds") - # Run evaluation if available - if run_evaluation is not None: - result = run_evaluation("diff_pair.gds", dp.name, dp) - print(result) - else: - print("Evaluation skipped - evaluator_wrapper not available") +if __name__=="__main__": + diff_pair = add_df_labels(diff_pair(sky130_mapped_pdk),sky130_mapped_pdk) + #diff_pair = diff_pair(sky130_mapped_pdk) + diff_pair.show() + diff_pair.name = "DIFF_PAIR" + #magic_drc_result = sky130_mapped_pdk.drc_magic(diff_pair, diff_pair.name) + #netgen_lvs_result = sky130_mapped_pdk.lvs_netgen(diff_pair, diff_pair.name) + diff_pair_gds = diff_pair.write_gds("diff_pair.gds") + res = run_evaluation("diff_pair.gds", diff_pair.name, diff_pair) \ No newline at end of file diff --git a/src/glayout/blocks/elementary/transmission_gate/transmission_gate.py b/src/glayout/blocks/elementary/transmission_gate/transmission_gate.py index 895cb5c0..c10f6028 100644 --- a/src/glayout/blocks/elementary/transmission_gate/transmission_gate.py +++ b/src/glayout/blocks/elementary/transmission_gate/transmission_gate.py @@ -15,7 +15,7 @@ from glayout.primitives.via_gen import via_stack from gdsfactory.components import text_freetype, rectangle try: - from evaluator_wrapper import run_evaluation + from glayout.blocks.evaluator_box.evaluator_wrapper import run_evaluation except ImportError: print("Warning: evaluator_wrapper not found. Evaluation will be skipped.") run_evaluation = None @@ -204,7 +204,9 @@ def transmission_gate( # Store netlist as string to avoid gymnasium info dict type restrictions # Compatible with both gdsfactory 7.7.0 and 7.16.0+ strict Pydantic validation netlist_obj = tg_netlist(nfet, pfet) - component.info['netlist'] = str(netlist_obj) + component.info['netlist'] = netlist_obj.generate_netlist() + # Store the Netlist object for hierarchical netlist building + component.info['netlist_obj'] = netlist_obj # Store serialized netlist data for reconstruction if needed component.info['netlist_data'] = { 'circuit_name': netlist_obj.circuit_name, diff --git a/src/glayout/blocks/evaluator_box/evaluator_wrapper.py b/src/glayout/blocks/evaluator_box/evaluator_wrapper.py index f8897ddf..7ff0863a 100644 --- a/src/glayout/blocks/evaluator_box/evaluator_wrapper.py +++ b/src/glayout/blocks/evaluator_box/evaluator_wrapper.py @@ -3,12 +3,19 @@ import os import json import logging +import shutil from datetime import datetime from pathlib import Path from gdsfactory.typings import Component -from verification import run_verification -from physical_features import run_physical_feature_extraction +# Make run_pex.sh executable if it exists +_evaluator_box_dir = Path(__file__).parent +_run_pex_script = _evaluator_box_dir / "run_pex.sh" +if _run_pex_script.exists(): + os.chmod(_run_pex_script, 0o755) + +from glayout.blocks.evaluator_box.verification import run_verification +from glayout.blocks.evaluator_box.physical_features import run_physical_feature_extraction def get_next_filename(base_name="evaluation", extension=".json"): """ @@ -28,22 +35,28 @@ def run_evaluation(layout_path: str, component_name: str, top_level: Component) """ print(f"--- Starting Comprehensive Evaluation for {component_name} ---") - # Deletes known intermediate and report files for a given component to ensure a clean run. + # Deletes known intermediate and report files/directories for a given component to ensure a clean run. print(f"Cleaning up intermediate files for component '{component_name}'...") - files_to_delete = [ + items_to_delete = [ f"{component_name}.res.ext", f"{component_name}.lvs.rpt", f"{component_name}_lvs.rpt", + f"{component_name}.drc.rpt", + f"{component_name}_drc_out", # New DRC output directory + f"{component_name}_lvs_out", # New LVS output directory f"{component_name}.nodes", f"{component_name}.sim", f"{component_name}.pex.spice", f"{component_name}_pex.spice" ] - for f_path in files_to_delete: + for f_path in items_to_delete: try: - if os.path.exists(f_path): + if os.path.isdir(f_path): + shutil.rmtree(f_path) + print(f" - Deleted directory: {f_path}") + elif os.path.exists(f_path): os.remove(f_path) print(f" - Deleted: {f_path}") except OSError as e: diff --git a/src/glayout/blocks/evaluator_box/physical_features.py b/src/glayout/blocks/evaluator_box/physical_features.py index 5e930b1c..2ce54377 100644 --- a/src/glayout/blocks/evaluator_box/physical_features.py +++ b/src/glayout/blocks/evaluator_box/physical_features.py @@ -7,6 +7,10 @@ from gdsfactory.typings import Component from gdsfactory.geometry.boolean import boolean +# Get the path to run_pex.sh in the evaluator_box directory +_EVALUATOR_BOX_DIR = Path(__file__).parent +_RUN_PEX_SCRIPT = _EVALUATOR_BOX_DIR / "run_pex.sh" + def calculate_area(component: Component) -> float: """Calculates the area of a gdsfactory Component.""" return float(component.area()) @@ -90,17 +94,20 @@ def run_physical_feature_extraction(layout_path: str, component_name: str, top_l pex_spice_path = f"{component_name}_pex.spice" if os.path.exists(pex_spice_path): os.remove(pex_spice_path) - # Invoke via explicit "bash" to avoid execute-bit issues on some systems - # If run_pex.sh lacks +x permission, this still works reliably. - subprocess.run(["bash", "run_pex.sh", layout_path, component_name], check=True, capture_output=True, text=True) + # Use the run_pex.sh from evaluator_box directory, not current directory + if not _RUN_PEX_SCRIPT.exists(): + raise FileNotFoundError(f"run_pex.sh not found at {_RUN_PEX_SCRIPT}") + # Make sure it's executable + os.chmod(_RUN_PEX_SCRIPT, 0o755) + subprocess.run([str(_RUN_PEX_SCRIPT), layout_path, component_name], check=True, capture_output=True, text=True) physical_results["pex"]["status"] = "PEX Complete" total_res, total_cap = _parse_simple_parasitics(component_name) physical_results["pex"]["total_resistance_ohms"] = total_res physical_results["pex"]["total_capacitance_farads"] = total_cap except subprocess.CalledProcessError as e: physical_results["pex"]["status"] = f"PEX Error: {e.stderr}" - except FileNotFoundError: - physical_results["pex"]["status"] = "PEX Error: run_pex.sh not found." + except FileNotFoundError as e: + physical_results["pex"]["status"] = f"PEX Error: {e}" except Exception as e: physical_results["pex"]["status"] = f"PEX Unexpected Error: {e}" @@ -113,4 +120,4 @@ def run_physical_feature_extraction(layout_path: str, component_name: str, top_l except Exception as e: print(f"Warning: Could not calculate geometric features. Error: {e}") - return physical_results \ No newline at end of file + return physical_results \ No newline at end of file diff --git a/src/glayout/blocks/evaluator_box/run_pex.sh b/src/glayout/blocks/evaluator_box/run_pex.sh index e7a32fd6..745e40d7 100755 --- a/src/glayout/blocks/evaluator_box/run_pex.sh +++ b/src/glayout/blocks/evaluator_box/run_pex.sh @@ -1,11 +1,21 @@ #!/bin/bash # Usage: ./run_pex.sh layout.gds layout_cell_name +# Requires PDK_ROOT environment variable to be set GDS_FILE=$1 LAYOUT_CELL=$2 -magic -rcfile ./sky130A.magicrc -noconsole -dnull << EOF +# Use PDK_ROOT to find the magicrc file +MAGICRC="${PDK_ROOT}/sky130A/libs.tech/magic/sky130A.magicrc" + +if [ ! -f "$MAGICRC" ]; then + echo "Error: Cannot find magicrc at $MAGICRC" + echo "Make sure PDK_ROOT is set correctly (current: $PDK_ROOT)" + exit 1 +fi + +magic -rcfile "$MAGICRC" -noconsole -dnull << EOF gds read $GDS_FILE flatten $LAYOUT_CELL load $LAYOUT_CELL diff --git a/src/glayout/blocks/evaluator_box/verification.py b/src/glayout/blocks/evaluator_box/verification.py index e423bd55..a1a14553 100644 --- a/src/glayout/blocks/evaluator_box/verification.py +++ b/src/glayout/blocks/evaluator_box/verification.py @@ -133,6 +133,9 @@ def parse_lvs_report(report_content: str) -> dict: def run_verification(layout_path: str, component_name: str, top_level: Component) -> dict: """ Runs DRC and LVS checks and returns a structured result dictionary. + Note: PDK functions create directory structures: + - DRC: {output_dir}/drc/{design_name}/{design_name}.rpt + - LVS: {output_dir}/lvs/{design_name}/{design_name}_lvs.rpt """ verification_results = { "drc": {"status": "not run", "is_pass": False, "report_path": None, "summary": {}}, @@ -140,15 +143,18 @@ def run_verification(layout_path: str, component_name: str, top_level: Component } # DRC Check - drc_report_path = os.path.abspath(f"./{component_name}.drc.rpt") - verification_results["drc"]["report_path"] = drc_report_path + # PDK creates: {drc_output_dir}/drc/{component_name}/{component_name}.rpt + drc_output_dir = os.path.abspath(f"./{component_name}_drc_out") + drc_actual_report = os.path.join(drc_output_dir, "drc", component_name, f"{component_name}.rpt") + verification_results["drc"]["report_path"] = drc_actual_report try: - if os.path.exists(drc_report_path): - os.remove(drc_report_path) - sky130.drc_magic(layout_path, component_name, output_file=drc_report_path) + # Clean up existing directory if present + if os.path.exists(drc_output_dir): + shutil.rmtree(drc_output_dir) + sky130.drc_magic(layout_path, component_name, output_file=drc_output_dir) report_content = "" - if os.path.exists(drc_report_path): - with open(drc_report_path, 'r') as f: + if os.path.exists(drc_actual_report): + with open(drc_actual_report, 'r') as f: report_content = f.read() summary = parse_drc_report(report_content) verification_results["drc"].update({"summary": summary, "is_pass": summary["is_pass"], "status": "pass" if summary["is_pass"] else "fail"}) @@ -156,15 +162,18 @@ def run_verification(layout_path: str, component_name: str, top_level: Component verification_results["drc"]["status"] = f"error: {e}" # LVS Check - lvs_report_path = os.path.abspath(f"./{component_name}.lvs.rpt") - verification_results["lvs"]["report_path"] = lvs_report_path + # PDK creates: {lvs_output_dir}/lvs/{component_name}/{component_name}_lvs.rpt + lvs_output_dir = os.path.abspath(f"./{component_name}_lvs_out") + lvs_actual_report = os.path.join(lvs_output_dir, "lvs", component_name, f"{component_name}_lvs.rpt") + verification_results["lvs"]["report_path"] = lvs_actual_report try: - if os.path.exists(lvs_report_path): - os.remove(lvs_report_path) - sky130.lvs_netgen(layout=top_level, design_name=component_name, output_file_path=lvs_report_path) + # Clean up existing directory if present + if os.path.exists(lvs_output_dir): + shutil.rmtree(lvs_output_dir) + sky130.lvs_netgen(layout=top_level, design_name=component_name, output_file_path=lvs_output_dir) report_content = "" - if os.path.exists(lvs_report_path): - with open(lvs_report_path, 'r') as report_file: + if os.path.exists(lvs_actual_report): + with open(lvs_actual_report, 'r') as report_file: report_content = report_file.read() lvs_summary = parse_lvs_report(report_content) verification_results["lvs"].update({"summary": lvs_summary, "is_pass": lvs_summary["is_pass"], "status": "pass" if lvs_summary["is_pass"] else "fail"}) diff --git a/src/glayout/pdk/mappedpdk.py b/src/glayout/pdk/mappedpdk.py index 35a03564..dd8b9732 100644 --- a/src/glayout/pdk/mappedpdk.py +++ b/src/glayout/pdk/mappedpdk.py @@ -259,6 +259,8 @@ class MappedPDK(Pdk): "via4", "met5", "capmet", + "lvs_bjt", + "drc_bjt", # _pin layers "met5_pin", "met4_pin", @@ -291,6 +293,7 @@ class MappedPDK(Pdk): # friendly way to implement a graph grules: dict[StrictStr, dict[StrictStr, Optional[dict[StrictStr, Any]]]] pdk_files: dict[StrictStr, Union[PathType, None]] + valid_bjt_sizes: dict[StrictStr, list[tuple[float,float]]] @validator("models") def models_check(cls, models_obj: dict[StrictStr, StrictStr]): From a46407d8b6e48321c77ed0983ef2a0c13b003fec Mon Sep 17 00:00:00 2001 From: Aditya Kak Date: Sat, 7 Feb 2026 18:23:02 +0000 Subject: [PATCH 5/5] removed unnecessary files --- src/glayout/blocks/elementary/FVF/README.md | 122 -- src/glayout/blocks/elementary/FVF/els | 20 - src/glayout/blocks/elementary/FVF/fvf.ext | 28 - src/glayout/blocks/elementary/FVF/fvf.nodes | 3 - src/glayout/blocks/elementary/FVF/fvf.res.ext | 1873 ----------------- src/glayout/blocks/elementary/FVF/fvf.sim | 19 - .../FVF/fvf_drc_out/drc/fvf/fvf.rpt | 21 - .../FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt | 58 - .../blocks/elementary/FVF/fvf_pex.spice | 1173 ----------- .../current_mirror/current_mirror.md | 8 - .../blocks/elementary/diff_pair/diff_pair.md | 10 - .../transmission_gate/transmission_gate.md | 8 - .../blocks/evaluator_box/evaluator_box.md | 7 - 13 files changed, 3350 deletions(-) delete mode 100644 src/glayout/blocks/elementary/FVF/README.md delete mode 100644 src/glayout/blocks/elementary/FVF/els delete mode 100644 src/glayout/blocks/elementary/FVF/fvf.ext delete mode 100644 src/glayout/blocks/elementary/FVF/fvf.nodes delete mode 100644 src/glayout/blocks/elementary/FVF/fvf.res.ext delete mode 100644 src/glayout/blocks/elementary/FVF/fvf.sim delete mode 100644 src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt delete mode 100644 src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt delete mode 100644 src/glayout/blocks/elementary/FVF/fvf_pex.spice delete mode 100644 src/glayout/blocks/elementary/current_mirror/current_mirror.md delete mode 100644 src/glayout/blocks/elementary/diff_pair/diff_pair.md delete mode 100644 src/glayout/blocks/elementary/transmission_gate/transmission_gate.md delete mode 100644 src/glayout/blocks/evaluator_box/evaluator_box.md diff --git a/src/glayout/blocks/elementary/FVF/README.md b/src/glayout/blocks/elementary/FVF/README.md deleted file mode 100644 index 5e375a45..00000000 --- a/src/glayout/blocks/elementary/FVF/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# FLIPPED VOLTAGE FOLLOWER CELL - -AL: Sep 29 2025 - -Migrated from Arnav's fork of OpenFASOC -- Updated code to make it compatible with latest new gLayout repo -- The evaluator_wrapper is broken, need to be fixed - -## Schematic -![FVF schematic](https://github.com/user-attachments/assets/369d8073-e5bb-4e17-96f4-22f496d5663a) - -A flipped voltage follower contains two fets connected as seen in this schematic. One is the input fet, the other one is the feedback fet. -## Parametrizing the FVF block -``` -def flipped_voltage_follower( - pdk: MappedPDK, - device_type: str = "nmos", - placement: str = "horizontal", - width: tuple[float,float] = (3,3), - length: tuple[float,float] = (None,None), - fingers: tuple[int,int] = (1,1), - multipliers: tuple[int,int] = (1,1), - dummy_1: tuple[bool,bool] = (True,True), - dummy_2: tuple[bool,bool] = (True,True), - tie_layers1: tuple[str,str] = ("met2","met1"), - tie_layers2: tuple[str,str] = ("met2","met1"), - sd_rmult: int=1, - **kwargs - ) -> Component: - """ - creates a Flipped Voltage Follower - pdk: pdk to use - device_type: either "nmos" or "pmos" - placement: either "horizontal" or "vertical" - width: (input fet, feedback fet) - length: (input fet, feedback fet) - fingers: (input fet, feedback fet) - multipliers: (input fet, feedback fet) - dummy_1: dummy for input fet - dummy_2: dummy for feedback fet - tie_layers1: tie layers for input fet - tie_layers2: tie layers for feedback fet - sd_rmult: sd_rmult for both fets - **kwargs: any kwarg that is supported by nmos and pmos -``` -### GDS generated -![gds generated](./fvfgds.png) -### DRC Report -``` -using default pdk_root: /usr/bin/miniconda3/share/pdk/ -Defaulting to stale magic_commands.tcl - -Magic 8.3 revision 464 - Compiled on Sat Mar 9 23:18:29 UTC 2024. -Starting magic under Tcl interpreter -Using the terminal as the console. -Using NULL graphics device. -Processing system .magicrc file -Sourcing design .magicrc for technology sky130A ... -2 Magic internal units = 1 Lambda -Input style sky130(): scaleFactor=2, multiplier=2 -The following types are not handled by extraction and will be treated as non-electrical types: - ubm -Scaled tech values by 2 / 1 to match internal grid scaling -Loading sky130A Device Generator Menu ... -Loading "/tmp/tmp0t0g30yo/magic_commands.tcl" from command line. -Warning: Calma reading is not undoable! I hope that's OK. -Library written using GDS-II Release 6.0 -Library name: library -Reading "fvf". -[INFO]: Loading fvf - -Loading DRC CIF style. -No errors found. -[INFO]: DONE with /tmp/tmp0t0g30yo/fvf.rpt - -Using technology "sky130A", version 1.0.471-0-g97d0844 - -Soft errors: -Error while reading cell "fvf" (byte position 118): Unknown layer/datatype in boundary, layer=64 type=44 -``` -### LVS Report -``` -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 NMOS in circuit fvf (1)(2 instances) - -Class fvf (0): Merged 3 parallel devices. -Class fvf (1): Merged 3 parallel devices. -Subcircuit summary: -Circuit 1: fvf |Circuit 2: fvf --------------------------------------------|------------------------------------------- -sky130_fd_pr__nfet_01v8 (6->3) |sky130_fd_pr__nfet_01v8 (6->3) -Number of devices: 3 |Number of devices: 3 -Number of nets: 4 |Number of nets: 4 ---------------------------------------------------------------------------------------- -Netlists match uniquely. - -Subcircuit pins: -Circuit 1: fvf |Circuit 2: fvf --------------------------------------------|------------------------------------------- -VIN |VIN -Ib |Ib -VOUT |VOUT -VBULK |VBULK ---------------------------------------------------------------------------------------- -Cell pin lists are equivalent. -Device classes fvf and fvf are equivalent. - -Final result: Circuits match uniquely. -``` diff --git a/src/glayout/blocks/elementary/FVF/els b/src/glayout/blocks/elementary/FVF/els deleted file mode 100644 index 3355bbbc..00000000 --- a/src/glayout/blocks/elementary/FVF/els +++ /dev/null @@ -1,20 +0,0 @@ -| units: 500000 tech: sky130A format: MIT -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=-663 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=248 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=-663 sky130_fd_pr__nfet_01v8 -x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=248 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=-863 sky130_fd_pr__nfet_01v8 -x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=-863 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=-863 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=248 sky130_fd_pr__nfet_01v8 -x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=248 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=248 sky130_fd_pr__nfet_01v8 -x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=-663 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=248 sky130_fd_pr__nfet_01v8 -C Ib VIN 0.7 -C Ib0 11.7 -R Ib 2390 -C VIN0 3.9 -R VIN 679 -R VOUT 67459 -= VOUT VBULK diff --git a/src/glayout/blocks/elementary/FVF/fvf.ext b/src/glayout/blocks/elementary/FVF/fvf.ext deleted file mode 100644 index ababadf5..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf.ext +++ /dev/null @@ -1,28 +0,0 @@ -timestamp 1400616048 -version 8.3 -tech sky130A -style ngspice() -scale 1000 1 500000 -resistclasses 4400000 2200000 950000 3050000 120000 197000 114000 191000 120000 197000 114000 191000 48200 319800 2000000 48200 48200 12800 125 125 47 47 29 5 -parameters sky130_fd_pr__nfet_01v8 l=l w=w a1=as p1=ps a2=ad p2=pd -port "Ib" 5 -1681 -175 -1581 -75 m2 -port "VIN" 3 100 -1098 200 -998 m1 -port "VOUT" 4 549 -377 649 -277 m2 -port "VBULK" 2 2508 970 2608 1070 m1 -node "Ib" 2390 11661.2 -1681 -175 m2 0 0 0 0 0 0 0 0 62400 1912 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 351448 3360 0 0 126852 4900 963214 20996 412124 9080 0 0 0 0 0 0 0 0 -node "VIN" 679 3876.86 100 -1098 m1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612408 4480 0 0 34848 2112 97000 3140 82508 2608 0 0 0 0 0 0 0 0 -substrate "VOUT" 0 0 549 -377 m2 0 0 0 0 0 0 0 0 499200 16232 1518640 37040 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1455648 14400 0 0 2352952 67214 1921678 40186 649934 9348 0 0 0 0 0 0 0 0 -equiv "VOUT" "VBULK" -cap "Ib" "VIN" 696.867 -device msubckt sky130_fd_pr__nfet_01v8 3039 -664 3040 -663 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 2361 -664 2362 -663 l=394 w=200 "VOUT" "Ib" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 1683 -664 1684 -663 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 3039 248 3040 249 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 2361 248 2362 249 l=394 w=200 "VOUT" "Ib" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 1683 248 1684 249 l=394 w=200 "VOUT" "VOUT" 788 0 "VOUT" 0 0 "VOUT" 400 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 521 -864 522 -863 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -237 -864 -236 -863 l=474 w=400 "VOUT" "VIN" 948 0 "VOUT" 400 31200,956 "Ib" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -995 -864 -994 -863 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 521 248 522 249 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -237 248 -236 249 l=474 w=400 "VOUT" "VIN" 948 0 "VOUT" 400 31200,956 "Ib" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -995 248 -994 249 l=474 w=400 "VOUT" "VOUT" 948 0 "VOUT" 0 0 "VOUT" 800 31200,956 diff --git a/src/glayout/blocks/elementary/FVF/fvf.nodes b/src/glayout/blocks/elementary/FVF/fvf.nodes deleted file mode 100644 index eca54a57..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf.nodes +++ /dev/null @@ -1,3 +0,0 @@ -Ib -1680 -174 m2 -VIN 100 -1097 m1 -VOUT 549 -376 m2 diff --git a/src/glayout/blocks/elementary/FVF/fvf.res.ext b/src/glayout/blocks/elementary/FVF/fvf.res.ext deleted file mode 100644 index 01036b3c..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf.res.ext +++ /dev/null @@ -1,1873 +0,0 @@ -scale 1000 1 500000 -rnode "VIN.t1" 0 0 0 448 0 -rnode "VIN.t0" 0 0 0 -664 0 -rnode "VIN.n0" 0 0 0 -864 0 -rnode "VIN" 0 0 100 -1098 0 -resist "VIN" "VIN.n0" 0.0144903 -resist "VIN.n0" "VIN.t0" 69.7708 -resist "VIN.n0" "VIN.t1" 81.827 -rnode "Ib.t2" 0 0 2558 348 0 -rnode "Ib.t3" 0 0 2558 -564 0 -rnode "Ib.n0" 0 0 2918 -858 0 -rnode "Ib.n1" 0 0 270 -562 0 -rnode "Ib.n2" 0 0 270 -664 0 -rnode "Ib.t0" 0 0 237 -664 0 -rnode "Ib.n3" 0 0 270 -630 0 -rnode "Ib.n4" 0 0 270 -630 0 -rnode "Ib.n5" 0 0 270 -592 0 -rnode "Ib.n6" 0 0 270 -592 0 -rnode "Ib.n7" 0 0 270 -520 0 -rnode "Ib.n8" 0 0 270 550 0 -rnode "Ib.n9" 0 0 270 448 0 -rnode "Ib.t1" 0 0 237 448 0 -rnode "Ib.n10" 0 0 270 482 0 -rnode "Ib.n11" 0 0 270 482 0 -rnode "Ib.n12" 0 0 270 520 0 -rnode "Ib.n13" 0 0 270 520 0 -rnode "Ib.n14" 0 0 270 592 0 -rnode "Ib.n15" 0 0 -702 -162 0 -rnode "Ib" 0 0 -1681 -175 0 -resist "Ib.n13" "Ib.n9" 3.44721 -resist "Ib.n6" "Ib.n2" 3.44721 -resist "Ib" "Ib.n15" 5.27024 -resist "Ib.n12" "Ib.n8" 5.81818 -resist "Ib.n5" "Ib.n1" 5.81818 -resist "Ib.n12" "Ib.n11" 7.3697 -resist "Ib.n5" "Ib.n4" 7.3697 -resist "Ib.n14" "Ib.n8" 8.14545 -resist "Ib.n7" "Ib.n1" 8.14545 -resist "Ib.n13" "Ib.n12" 9.3 -resist "Ib.n6" "Ib.n5" 9.3 -resist "Ib.n14" "Ib.n13" 9.45517 -resist "Ib.n7" "Ib.n6" 9.45517 -resist "Ib.n11" "Ib.n9" 9.71124 -resist "Ib.n4" "Ib.n2" 9.71124 -resist "Ib" "Ib.n0" 20.9418 -resist "Ib.n10" "Ib.t1" 52.3077 -resist "Ib.n3" "Ib.t0" 52.3077 -resist "Ib.n0" "Ib.t3" 73.2946 -resist "Ib.n0" "Ib.t2" 77.952 -resist "Ib.n15" "Ib.n7" 87.9619 -resist "Ib.n15" "Ib.n14" 97.7608 -resist "Ib.t1" "Ib.n9" 167.116 -resist "Ib.t0" "Ib.n2" 167.116 -resist "Ib.n11" "Ib.n10" 185 -resist "Ib.n4" "Ib.n3" 185 -resist "Ib.n10" "Ib.n8" 289.615 -resist "Ib.n3" "Ib.n1" 289.615 -rnode "VOUT.n0" 0 0 2608 1029 0 -rnode "VOUT.n1" 0 0 2508 1029 0 -rnode "VOUT.n2" 0 0 2308 1029 0 -rnode "VOUT.n3" 0 0 2408 1029 0 -rnode "VOUT.n4" 0 0 2308 1029 0 -rnode "VOUT.n5" 0 0 2208 1029 0 -rnode "VOUT.n6" 0 0 2108 1029 0 -rnode "VOUT.n7" 0 0 1908 1029 0 -rnode "VOUT.n8" 0 0 2008 1029 0 -rnode "VOUT.n9" 0 0 1908 1029 0 -rnode "VOUT.n10" 0 0 1808 1029 0 -rnode "VOUT.n11" 0 0 1708 1029 0 -rnode "VOUT.n12" 0 0 1432 918 0 -rnode "VOUT.n13" 0 0 1708 1029 0 -rnode "VOUT.n14" 0 0 1432 918 0 -rnode "VOUT.n15" 0 0 1708 1029 0 -rnode "VOUT.n16" 0 0 1608 -1029 0 -rnode "VOUT.n17" 0 0 1432 850 0 -rnode "VOUT.n18" 0 0 1432 714 0 -rnode "VOUT.n19" 0 0 1432 578 0 -rnode "VOUT.n20" 0 0 1432 442 0 -rnode "VOUT.n21" 0 0 1432 306 0 -rnode "VOUT.n22" 0 0 1432 170 0 -rnode "VOUT.n23" 0 0 1432 34 0 -rnode "VOUT.n24" 0 0 1432 -102 0 -rnode "VOUT.n25" 0 0 1432 -238 0 -rnode "VOUT.n26" 0 0 1432 -374 0 -rnode "VOUT.n27" 0 0 1432 -510 0 -rnode "VOUT.n28" 0 0 1432 -646 0 -rnode "VOUT.n29" 0 0 1432 -782 0 -rnode "VOUT.n30" 0 0 1432 -850 0 -rnode "VOUT.t33" 0 0 1683 -564 0 -rnode "VOUT.t32" 0 0 2077 -564 0 -rnode "VOUT.t31" 0 0 1880 -664 0 -rnode "VOUT.n31" 0 0 1880 -747 0 -rnode "VOUT.n32" 0 0 1650 -714 0 -rnode "VOUT.t13" 0 0 1683 348 0 -rnode "VOUT.t12" 0 0 2077 348 0 -rnode "VOUT.t10" 0 0 1880 248 0 -rnode "VOUT.n33" 0 0 1880 165 0 -rnode "VOUT.n34" 0 0 1650 198 0 -rnode "VOUT.n35" 0 0 1473 165 0 -rnode "VOUT.n36" 0 0 1432 850 0 -rnode "VOUT.n37" 0 0 1432 850 0 -rnode "VOUT.n38" 0 0 1432 782 0 -rnode "VOUT.n39" 0 0 1432 782 0 -rnode "VOUT.n40" 0 0 1432 714 0 -rnode "VOUT.n41" 0 0 1432 714 0 -rnode "VOUT.n42" 0 0 1432 646 0 -rnode "VOUT.n43" 0 0 1432 646 0 -rnode "VOUT.n44" 0 0 1432 578 0 -rnode "VOUT.n45" 0 0 1432 578 0 -rnode "VOUT.n46" 0 0 1432 510 0 -rnode "VOUT.n47" 0 0 1432 510 0 -rnode "VOUT.n48" 0 0 1432 442 0 -rnode "VOUT.n49" 0 0 1432 442 0 -rnode "VOUT.n50" 0 0 1432 374 0 -rnode "VOUT.n51" 0 0 1432 374 0 -rnode "VOUT.n52" 0 0 1432 306 0 -rnode "VOUT.n53" 0 0 1432 306 0 -rnode "VOUT.n54" 0 0 1432 238 0 -rnode "VOUT.n55" 0 0 1432 238 0 -rnode "VOUT.n56" 0 0 1432 170 0 -rnode "VOUT.n57" 0 0 1432 170 0 -rnode "VOUT.n58" 0 0 1432 102 0 -rnode "VOUT.n59" 0 0 1432 102 0 -rnode "VOUT.n60" 0 0 1432 34 0 -rnode "VOUT.n61" 0 0 1432 34 0 -rnode "VOUT.n62" 0 0 1432 -34 0 -rnode "VOUT.n63" 0 0 1432 -34 0 -rnode "VOUT.n64" 0 0 1432 -102 0 -rnode "VOUT.n65" 0 0 1432 -102 0 -rnode "VOUT.n66" 0 0 1432 -170 0 -rnode "VOUT.n67" 0 0 1432 -170 0 -rnode "VOUT.n68" 0 0 1432 -238 0 -rnode "VOUT.n69" 0 0 1432 -238 0 -rnode "VOUT.n70" 0 0 1432 -306 0 -rnode "VOUT.n71" 0 0 1432 -306 0 -rnode "VOUT.t35" 0 0 2361 -564 0 -rnode "VOUT.t2" 0 0 2361 348 0 -rnode "VOUT.t1" 0 0 2755 348 0 -rnode "VOUT.t34" 0 0 2755 -564 0 -rnode "VOUT" 0 0 549 -377 0 -rnode "VOUT.n72" 0 0 -270 550 0 -rnode "VOUT.n73" 0 0 -270 448 0 -rnode "VOUT.t5" 0 0 -237 448 0 -rnode "VOUT.n74" 0 0 -270 482 0 -rnode "VOUT.n75" 0 0 -270 482 0 -rnode "VOUT.n76" 0 0 -270 520 0 -rnode "VOUT.n77" 0 0 -270 520 0 -rnode "VOUT.n78" 0 0 -270 592 0 -rnode "VOUT.n79" 0 0 -270 -562 0 -rnode "VOUT.n80" 0 0 -270 -664 0 -rnode "VOUT.t4" 0 0 -237 -664 0 -rnode "VOUT.n81" 0 0 -270 -630 0 -rnode "VOUT.n82" 0 0 -270 -630 0 -rnode "VOUT.n83" 0 0 -270 -592 0 -rnode "VOUT.n84" 0 0 -270 -592 0 -rnode "VOUT.n85" 0 0 -270 -520 0 -rnode "VOUT.n86" 0 0 -270 -320 0 -rnode "VOUT.n87" 0 0 599 -320 0 -rnode "VOUT.n88" 0 0 2009 438 0 -rnode "VOUT.n89" 0 0 2049 438 0 -rnode "VOUT.n90" 0 0 2297 -380 0 -rnode "VOUT.n91" 0 0 1473 -320 0 -rnode "VOUT.n92" 0 0 1432 -374 0 -rnode "VOUT.n93" 0 0 1432 -374 0 -rnode "VOUT.n94" 0 0 1432 -442 0 -rnode "VOUT.n95" 0 0 1432 -442 0 -rnode "VOUT.n96" 0 0 1432 -510 0 -rnode "VOUT.n97" 0 0 1432 -510 0 -rnode "VOUT.n98" 0 0 1432 -578 0 -rnode "VOUT.n99" 0 0 1432 -578 0 -rnode "VOUT.n100" 0 0 1432 -646 0 -rnode "VOUT.n101" 0 0 1432 -646 0 -rnode "VOUT.n102" 0 0 1432 -714 0 -rnode "VOUT.n103" 0 0 1432 -714 0 -rnode "VOUT.n104" 0 0 1473 -747 0 -rnode "VOUT.n105" 0 0 1432 -782 0 -rnode "VOUT.n106" 0 0 1432 -782 0 -rnode "VOUT.n107" 0 0 1432 -850 0 -rnode "VOUT.n108" 0 0 1708 -1029 0 -rnode "VOUT.n109" 0 0 1808 -1029 0 -rnode "VOUT.n110" 0 0 1908 -1029 0 -rnode "VOUT.n111" 0 0 2108 1029 0 -rnode "VOUT.n112" 0 0 2108 1029 0 -rnode "VOUT.n113" 0 0 2108 -1029 0 -rnode "VOUT.n114" 0 0 2108 -1029 0 -rnode "VOUT.n115" 0 0 1908 -1029 0 -rnode "VOUT.n116" 0 0 2308 -1029 0 -rnode "VOUT.n117" 0 0 2308 -1029 0 -rnode "VOUT.n118" 0 0 2308 -1029 0 -rnode "VOUT.n119" 0 0 2508 1029 0 -rnode "VOUT.n120" 0 0 2508 -1029 0 -rnode "VOUT.n121" 0 0 2508 -1029 0 -rnode "VOUT.n122" 0 0 2708 -1029 0 -rnode "VOUT.n123" 0 0 2708 -1029 0 -rnode "VOUT.n124" 0 0 2708 -1029 0 -rnode "VOUT.n125" 0 0 2708 1029 0 -rnode "VOUT.t0" 0 0 2558 348 0 -rnode "VOUT.n126" 0 0 2708 1029 0 -rnode "VOUT.n127" 0 0 2508 1029 0 -rnode "VOUT.n128" 0 0 2808 1029 0 -rnode "VOUT.n129" 0 0 3008 1029 0 -rnode "VOUT.n130" 0 0 3008 1029 0 -rnode "VOUT.n131" 0 0 3008 1029 0 -rnode "VOUT.n132" 0 0 2808 1029 0 -rnode "VOUT.n133" 0 0 3008 1029 0 -rnode "VOUT.n134" 0 0 2908 -1029 0 -rnode "VOUT.n135" 0 0 2908 -1029 0 -rnode "VOUT.n136" 0 0 3108 -1029 0 -rnode "VOUT.n137" 0 0 3108 -1029 0 -rnode "VOUT.n138" 0 0 3208 -1029 0 -rnode "VOUT.n139" 0 0 3208 1029 0 -rnode "VOUT.n140" 0 0 3208 1029 0 -rnode "VOUT.n141" 0 0 3208 1029 0 -rnode "VOUT.n142" 0 0 3408 1029 0 -rnode "VOUT.n143" 0 0 3408 1029 0 -rnode "VOUT.n144" 0 0 3408 1029 0 -rnode "VOUT.n145" 0 0 3408 1029 0 -rnode "VOUT.n146" 0 0 3408 -1029 0 -rnode "VOUT.n147" 0 0 3408 -1029 0 -rnode "VOUT.n148" 0 0 3208 -1029 0 -rnode "VOUT.n149" 0 0 3684 -918 0 -rnode "VOUT.n150" 0 0 3684 -918 0 -rnode "VOUT.n151" 0 0 3684 918 0 -rnode "VOUT.n152" 0 0 3684 918 0 -rnode "VOUT.n153" 0 0 3684 782 0 -rnode "VOUT.n154" 0 0 3684 918 0 -rnode "VOUT.n155" 0 0 3684 578 0 -rnode "VOUT.n156" 0 0 3684 442 0 -rnode "VOUT.n157" 0 0 3684 306 0 -rnode "VOUT.n158" 0 0 3684 170 0 -rnode "VOUT.t29" 0 0 3433 348 0 -rnode "VOUT.t30" 0 0 3039 348 0 -rnode "VOUT.t28" 0 0 3236 248 0 -rnode "VOUT.n159" 0 0 3236 165 0 -rnode "VOUT.n160" 0 0 3466 198 0 -rnode "VOUT.n161" 0 0 3684 34 0 -rnode "VOUT.n162" 0 0 3684 -102 0 -rnode "VOUT.n163" 0 0 3684 -238 0 -rnode "VOUT.n164" 0 0 3684 -374 0 -rnode "VOUT.n165" 0 0 3684 -510 0 -rnode "VOUT.n166" 0 0 3684 -646 0 -rnode "VOUT.t26" 0 0 3433 -564 0 -rnode "VOUT.t27" 0 0 3039 -564 0 -rnode "VOUT.t24" 0 0 3236 -664 0 -rnode "VOUT.n167" 0 0 3236 -747 0 -rnode "VOUT.n168" 0 0 3466 -714 0 -rnode "VOUT.n169" 0 0 3643 -747 0 -rnode "VOUT.n170" 0 0 3684 918 0 -rnode "VOUT.n171" 0 0 3684 -850 0 -rnode "VOUT.n172" 0 0 3684 -850 0 -rnode "VOUT.n173" 0 0 3684 -782 0 -rnode "VOUT.n174" 0 0 3684 -782 0 -rnode "VOUT.n175" 0 0 3684 918 0 -rnode "VOUT.n176" 0 0 3684 -714 0 -rnode "VOUT.n177" 0 0 3684 -714 0 -rnode "VOUT.n178" 0 0 3684 -646 0 -rnode "VOUT.n179" 0 0 3684 -578 0 -rnode "VOUT.n180" 0 0 3684 -578 0 -rnode "VOUT.n181" 0 0 3684 918 0 -rnode "VOUT.n182" 0 0 3684 -510 0 -rnode "VOUT.n183" 0 0 3684 918 0 -rnode "VOUT.n184" 0 0 3684 -442 0 -rnode "VOUT.n185" 0 0 3684 -442 0 -rnode "VOUT.n186" 0 0 3684 -374 0 -rnode "VOUT.n187" 0 0 3684 -306 0 -rnode "VOUT.n188" 0 0 3684 -306 0 -rnode "VOUT.n189" 0 0 3684 918 0 -rnode "VOUT.n190" 0 0 3684 -238 0 -rnode "VOUT.n191" 0 0 3684 918 0 -rnode "VOUT.n192" 0 0 3684 -170 0 -rnode "VOUT.n193" 0 0 3684 -170 0 -rnode "VOUT.n194" 0 0 3684 -102 0 -rnode "VOUT.n195" 0 0 3684 -34 0 -rnode "VOUT.n196" 0 0 3684 -34 0 -rnode "VOUT.n197" 0 0 3684 918 0 -rnode "VOUT.n198" 0 0 3684 34 0 -rnode "VOUT.n199" 0 0 3684 918 0 -rnode "VOUT.n200" 0 0 3684 102 0 -rnode "VOUT.n201" 0 0 3684 102 0 -rnode "VOUT.n202" 0 0 3643 165 0 -rnode "VOUT.n203" 0 0 3684 170 0 -rnode "VOUT.n204" 0 0 3684 238 0 -rnode "VOUT.n205" 0 0 3684 238 0 -rnode "VOUT.n206" 0 0 3684 918 0 -rnode "VOUT.n207" 0 0 3684 306 0 -rnode "VOUT.n208" 0 0 3684 918 0 -rnode "VOUT.n209" 0 0 3684 374 0 -rnode "VOUT.n210" 0 0 3684 374 0 -rnode "VOUT.n211" 0 0 3684 442 0 -rnode "VOUT.n212" 0 0 3684 510 0 -rnode "VOUT.n213" 0 0 3684 510 0 -rnode "VOUT.n214" 0 0 3684 918 0 -rnode "VOUT.n215" 0 0 3684 578 0 -rnode "VOUT.n216" 0 0 3684 646 0 -rnode "VOUT.n217" 0 0 3684 646 0 -rnode "VOUT.n218" 0 0 3684 714 0 -rnode "VOUT.n219" 0 0 3684 714 0 -rnode "VOUT.n220" 0 0 3684 782 0 -rnode "VOUT.n221" 0 0 3684 918 0 -rnode "VOUT.n222" 0 0 3684 850 0 -rnode "VOUT.n223" 0 0 3684 850 0 -rnode "VOUT.n224" 0 0 3684 918 0 -rnode "VOUT.n225" 0 0 3508 1029 0 -rnode "VOUT.n226" 0 0 3508 1029 0 -rnode "VOUT.n227" 0 0 3508 1029 0 -rnode "VOUT.n228" 0 0 3508 1029 0 -rnode "VOUT.n229" 0 0 3508 -1029 0 -rnode "VOUT.n230" 0 0 3508 -1029 0 -rnode "VOUT.n231" 0 0 3508 -1029 0 -rnode "VOUT.n232" 0 0 3408 -1029 0 -rnode "VOUT.n233" 0 0 3208 -1029 0 -rnode "VOUT.n234" 0 0 3308 -1029 0 -rnode "VOUT.n235" 0 0 3308 -1029 0 -rnode "VOUT.n236" 0 0 3308 -1029 0 -rnode "VOUT.t25" 0 0 3236 348 0 -rnode "VOUT.n237" 0 0 3308 1029 0 -rnode "VOUT.n238" 0 0 3308 1029 0 -rnode "VOUT.n239" 0 0 3308 1029 0 -rnode "VOUT.n240" 0 0 3308 1029 0 -rnode "VOUT.n241" 0 0 3208 1029 0 -rnode "VOUT.n242" 0 0 3108 1029 0 -rnode "VOUT.n243" 0 0 3108 1029 0 -rnode "VOUT.n244" 0 0 3108 1029 0 -rnode "VOUT.n245" 0 0 3108 1029 0 -rnode "VOUT.n246" 0 0 3108 -1029 0 -rnode "VOUT.n247" 0 0 3008 -1029 0 -rnode "VOUT.n248" 0 0 3008 -1029 0 -rnode "VOUT.n249" 0 0 3008 -1029 0 -rnode "VOUT.n250" 0 0 2908 -1029 0 -rnode "VOUT.n251" 0 0 2808 -1029 0 -rnode "VOUT.n252" 0 0 2808 -1029 0 -rnode "VOUT.n253" 0 0 2808 -1029 0 -rnode "VOUT.n254" 0 0 2808 1029 0 -rnode "VOUT.n255" 0 0 2908 1029 0 -rnode "VOUT.n256" 0 0 2908 1029 0 -rnode "VOUT.n257" 0 0 2908 1029 0 -rnode "VOUT.n258" 0 0 2908 1029 0 -rnode "VOUT.n259" 0 0 2808 1029 0 -rnode "VOUT.n260" 0 0 2708 1029 0 -rnode "VOUT.n261" 0 0 2708 1029 0 -rnode "VOUT.n262" 0 0 2608 1029 0 -rnode "VOUT.n263" 0 0 2608 1029 0 -rnode "VOUT.n264" 0 0 2608 1029 0 -rnode "VOUT.n265" 0 0 2608 -1029 0 -rnode "VOUT.n266" 0 0 2608 -1029 0 -rnode "VOUT.n267" 0 0 2608 -1029 0 -rnode "VOUT.n268" 0 0 2508 -1029 0 -rnode "VOUT.n269" 0 0 2408 -1029 0 -rnode "VOUT.n270" 0 0 2408 -1029 0 -rnode "VOUT.n271" 0 0 2408 -1029 0 -rnode "VOUT.n272" 0 0 2408 1029 0 -rnode "VOUT.n273" 0 0 2308 1029 0 -rnode "VOUT.n274" 0 0 2208 1029 0 -rnode "VOUT.n275" 0 0 2208 -1029 0 -rnode "VOUT.n276" 0 0 2208 -1029 0 -rnode "VOUT.n277" 0 0 2208 -1029 0 -rnode "VOUT.n278" 0 0 2108 -1029 0 -rnode "VOUT.n279" 0 0 1808 -1029 0 -rnode "VOUT.n280" 0 0 1908 -1029 0 -rnode "VOUT.n281" 0 0 2008 -1029 0 -rnode "VOUT.n282" 0 0 2008 -1029 0 -rnode "VOUT.n283" 0 0 2008 -1029 0 -rnode "VOUT.n284" 0 0 2008 1029 0 -rnode "VOUT.n285" 0 0 1908 1029 0 -rnode "VOUT.t11" 0 0 1880 348 0 -rnode "VOUT.n286" 0 0 1808 1029 0 -rnode "VOUT.n287" 0 0 1808 -1029 0 -rnode "VOUT.n288" 0 0 1708 -1029 0 -rnode "VOUT.n289" 0 0 1708 -1029 0 -rnode "VOUT.n290" 0 0 1608 -1029 0 -rnode "VOUT.n291" 0 0 1608 -1029 0 -rnode "VOUT.n292" 0 0 1432 -918 0 -rnode "VOUT.n293" 0 0 1432 -918 0 -rnode "VOUT.n294" 0 0 1432 -918 0 -rnode "VOUT.n295" 0 0 1246 1088 0 -rnode "VOUT.n296" 0 0 1246 1088 0 -rnode "VOUT.n297" 0 0 1246 1088 0 -rnode "VOUT.n298" 0 0 1246 1088 0 -rnode "VOUT.n299" 0 0 1246 1088 0 -rnode "VOUT.n300" 0 0 1246 1088 0 -rnode "VOUT.n301" 0 0 1246 1088 0 -rnode "VOUT.n302" 0 0 1246 1088 0 -rnode "VOUT.n303" 0 0 1246 1088 0 -rnode "VOUT.n304" 0 0 1246 1088 0 -rnode "VOUT.n305" 0 0 1246 1088 0 -rnode "VOUT.n306" 0 0 1246 1088 0 -rnode "VOUT.n307" 0 0 1246 1088 0 -rnode "VOUT.n308" 0 0 1246 1088 0 -rnode "VOUT.n309" 0 0 1246 1088 0 -rnode "VOUT.n310" 0 0 1050 1229 0 -rnode "VOUT.n311" 0 0 1246 952 0 -rnode "VOUT.n312" 0 0 1246 1020 0 -rnode "VOUT.n313" 0 0 1050 1229 0 -rnode "VOUT.n314" 0 0 1050 1229 0 -rnode "VOUT.t8" 0 0 995 448 0 -rnode "VOUT.t9" 0 0 521 448 0 -rnode "VOUT.t6" 0 0 758 448 0 -rnode "VOUT.n315" 0 0 758 165 0 -rnode "VOUT.n316" 0 0 1028 198 0 -rnode "VOUT.t22" 0 0 995 -664 0 -rnode "VOUT.t23" 0 0 521 -664 0 -rnode "VOUT.t21" 0 0 758 -664 0 -rnode "VOUT.n317" 0 0 758 -947 0 -rnode "VOUT.n318" 0 0 1028 -914 0 -rnode "VOUT.n319" 0 0 1050 -1229 0 -rnode "VOUT.n320" 0 0 950 -1229 0 -rnode "VOUT.n321" 0 0 850 -1229 0 -rnode "VOUT.n322" 0 0 650 -1229 0 -rnode "VOUT.n323" 0 0 650 -1229 0 -rnode "VOUT.n324" 0 0 850 -1229 0 -rnode "VOUT.n325" 0 0 650 -1229 0 -rnode "VOUT.t7" 0 0 758 448 0 -rnode "VOUT.n326" 0 0 650 1229 0 -rnode "VOUT.n327" 0 0 850 1229 0 -rnode "VOUT.n328" 0 0 650 1229 0 -rnode "VOUT.n329" 0 0 850 1229 0 -rnode "VOUT.n330" 0 0 1050 1229 0 -rnode "VOUT.n331" 0 0 850 1229 0 -rnode "VOUT.n332" 0 0 950 1229 0 -rnode "VOUT.n333" 0 0 950 1229 0 -rnode "VOUT.n334" 0 0 950 1229 0 -rnode "VOUT.n335" 0 0 950 1229 0 -rnode "VOUT.n336" 0 0 850 1229 0 -rnode "VOUT.n337" 0 0 750 1229 0 -rnode "VOUT.n338" 0 0 650 1229 0 -rnode "VOUT.n339" 0 0 550 1229 0 -rnode "VOUT.n340" 0 0 450 1229 0 -rnode "VOUT.n341" 0 0 450 1229 0 -rnode "VOUT.n342" 0 0 550 -1229 0 -rnode "VOUT.n343" 0 0 450 -1229 0 -rnode "VOUT.n344" 0 0 350 -1229 0 -rnode "VOUT.n345" 0 0 250 1229 0 -rnode "VOUT.n346" 0 0 250 1229 0 -rnode "VOUT.n347" 0 0 450 1229 0 -rnode "VOUT.n348" 0 0 350 1229 0 -rnode "VOUT.n349" 0 0 250 1229 0 -rnode "VOUT.n350" 0 0 150 1229 0 -rnode "VOUT.n351" 0 0 50 1229 0 -rnode "VOUT.n352" 0 0 50 1229 0 -rnode "VOUT.n353" 0 0 150 -1229 0 -rnode "VOUT.n354" 0 0 50 -1229 0 -rnode "VOUT.n355" 0 0 -50 -1229 0 -rnode "VOUT.n356" 0 0 -150 1229 0 -rnode "VOUT.n357" 0 0 -150 1229 0 -rnode "VOUT.n358" 0 0 50 1229 0 -rnode "VOUT.n359" 0 0 -50 1229 0 -rnode "VOUT.n360" 0 0 -150 1229 0 -rnode "VOUT.n361" 0 0 -250 1229 0 -rnode "VOUT.n362" 0 0 -350 1229 0 -rnode "VOUT.n363" 0 0 -350 1229 0 -rnode "VOUT.n364" 0 0 -250 -1229 0 -rnode "VOUT.n365" 0 0 -350 -1229 0 -rnode "VOUT.n366" 0 0 -450 -1229 0 -rnode "VOUT.n367" 0 0 -550 1229 0 -rnode "VOUT.n368" 0 0 -550 1229 0 -rnode "VOUT.n369" 0 0 -350 1229 0 -rnode "VOUT.n370" 0 0 -450 1229 0 -rnode "VOUT.n371" 0 0 -550 1229 0 -rnode "VOUT.n372" 0 0 -650 1229 0 -rnode "VOUT.n373" 0 0 -750 1229 0 -rnode "VOUT.n374" 0 0 -750 1229 0 -rnode "VOUT.n375" 0 0 -650 -1229 0 -rnode "VOUT.n376" 0 0 -750 -1229 0 -rnode "VOUT.n377" 0 0 -850 -1229 0 -rnode "VOUT.n378" 0 0 -950 1229 0 -rnode "VOUT.n379" 0 0 -950 1229 0 -rnode "VOUT.n380" 0 0 -750 1229 0 -rnode "VOUT.n381" 0 0 -850 1229 0 -rnode "VOUT.n382" 0 0 -950 1229 0 -rnode "VOUT.n383" 0 0 -1050 1229 0 -rnode "VOUT.n384" 0 0 -1246 1088 0 -rnode "VOUT.n385" 0 0 -1050 -1229 0 -rnode "VOUT.n386" 0 0 -1246 -1088 0 -rnode "VOUT.n387" 0 0 -1246 -952 0 -rnode "VOUT.n388" 0 0 -1246 -816 0 -rnode "VOUT.n389" 0 0 -1246 -680 0 -rnode "VOUT.n390" 0 0 -1246 -544 0 -rnode "VOUT.n391" 0 0 -1246 -408 0 -rnode "VOUT.n392" 0 0 -1246 -272 0 -rnode "VOUT.n393" 0 0 -1246 -136 0 -rnode "VOUT.n394" 0 0 -1246 0 0 -rnode "VOUT.n395" 0 0 -1246 136 0 -rnode "VOUT.n396" 0 0 -1246 272 0 -rnode "VOUT.n397" 0 0 -1246 408 0 -rnode "VOUT.n398" 0 0 -1246 544 0 -rnode "VOUT.n399" 0 0 -1246 680 0 -rnode "VOUT.n400" 0 0 -1246 816 0 -rnode "VOUT.n401" 0 0 -1246 1020 0 -rnode "VOUT.n402" 0 0 -1246 884 0 -rnode "VOUT.n403" 0 0 -1246 1088 0 -rnode "VOUT.n404" 0 0 -1246 1020 0 -rnode "VOUT.t17" 0 0 -995 448 0 -rnode "VOUT.t16" 0 0 -521 448 0 -rnode "VOUT.t14" 0 0 -758 448 0 -rnode "VOUT.n405" 0 0 -758 165 0 -rnode "VOUT.n406" 0 0 -1028 198 0 -rnode "VOUT.t20" 0 0 -995 -664 0 -rnode "VOUT.t19" 0 0 -521 -664 0 -rnode "VOUT.t18" 0 0 -758 -664 0 -rnode "VOUT.n407" 0 0 -758 -947 0 -rnode "VOUT.n408" 0 0 -1028 -914 0 -rnode "VOUT.n409" 0 0 -950 -1229 0 -rnode "VOUT.n410" 0 0 -750 -1229 0 -rnode "VOUT.n411" 0 0 -550 -1229 0 -rnode "VOUT.n412" 0 0 -350 -1229 0 -rnode "VOUT.n413" 0 0 -150 -1229 0 -rnode "VOUT.n414" 0 0 50 -1229 0 -rnode "VOUT.n415" 0 0 250 -1229 0 -rnode "VOUT.n416" 0 0 450 -1229 0 -rnode "VOUT.n417" 0 0 550 -1229 0 -rnode "VOUT.n418" 0 0 550 -1229 0 -rnode "VOUT.n419" 0 0 450 -1229 0 -rnode "VOUT.n420" 0 0 350 -1229 0 -rnode "VOUT.n421" 0 0 350 -1229 0 -rnode "VOUT.n422" 0 0 250 -1229 0 -rnode "VOUT.n423" 0 0 250 -1229 0 -rnode "VOUT.n424" 0 0 150 -1229 0 -rnode "VOUT.n425" 0 0 150 -1229 0 -rnode "VOUT.n426" 0 0 50 -1229 0 -rnode "VOUT.n427" 0 0 -50 -1229 0 -rnode "VOUT.n428" 0 0 -50 -1229 0 -rnode "VOUT.n429" 0 0 -150 -1229 0 -rnode "VOUT.n430" 0 0 -150 -1229 0 -rnode "VOUT.n431" 0 0 -250 -1229 0 -rnode "VOUT.n432" 0 0 -250 -1229 0 -rnode "VOUT.n433" 0 0 -350 -1229 0 -rnode "VOUT.n434" 0 0 -450 -1229 0 -rnode "VOUT.n435" 0 0 -450 -1229 0 -rnode "VOUT.n436" 0 0 -550 -1229 0 -rnode "VOUT.n437" 0 0 -550 -1229 0 -rnode "VOUT.n438" 0 0 -650 -1229 0 -rnode "VOUT.n439" 0 0 -650 -1229 0 -rnode "VOUT.n440" 0 0 -750 -1229 0 -rnode "VOUT.n441" 0 0 -850 -1229 0 -rnode "VOUT.n442" 0 0 -850 -1229 0 -rnode "VOUT.n443" 0 0 -950 -1229 0 -rnode "VOUT.n444" 0 0 -950 -1229 0 -rnode "VOUT.n445" 0 0 -1050 -1229 0 -rnode "VOUT.n446" 0 0 -1050 -1229 0 -rnode "VOUT.n447" 0 0 -1246 -1088 0 -rnode "VOUT.n448" 0 0 -1246 -1088 0 -rnode "VOUT.n449" 0 0 -1246 -1020 0 -rnode "VOUT.n450" 0 0 -1246 -1020 0 -rnode "VOUT.n451" 0 0 -1246 -952 0 -rnode "VOUT.n452" 0 0 -1246 -952 0 -rnode "VOUT.n453" 0 0 -1205 -947 0 -rnode "VOUT.n454" 0 0 -1246 -884 0 -rnode "VOUT.n455" 0 0 -1246 -884 0 -rnode "VOUT.n456" 0 0 -1246 -816 0 -rnode "VOUT.n457" 0 0 -1246 -816 0 -rnode "VOUT.n458" 0 0 -1246 -748 0 -rnode "VOUT.n459" 0 0 -1246 -748 0 -rnode "VOUT.n460" 0 0 -1246 -680 0 -rnode "VOUT.n461" 0 0 -1246 -680 0 -rnode "VOUT.n462" 0 0 -1246 -612 0 -rnode "VOUT.n463" 0 0 -1246 -612 0 -rnode "VOUT.n464" 0 0 -1246 -544 0 -rnode "VOUT.n465" 0 0 -1246 -544 0 -rnode "VOUT.n466" 0 0 -1246 -476 0 -rnode "VOUT.n467" 0 0 -1246 -476 0 -rnode "VOUT.n468" 0 0 -1246 -408 0 -rnode "VOUT.n469" 0 0 -1246 -408 0 -rnode "VOUT.n470" 0 0 -1246 -340 0 -rnode "VOUT.n471" 0 0 -1246 -340 0 -rnode "VOUT.n472" 0 0 -1246 -272 0 -rnode "VOUT.n473" 0 0 -1246 -272 0 -rnode "VOUT.n474" 0 0 -1246 -204 0 -rnode "VOUT.n475" 0 0 -1246 -204 0 -rnode "VOUT.n476" 0 0 -1246 -136 0 -rnode "VOUT.n477" 0 0 -1246 -136 0 -rnode "VOUT.n478" 0 0 -1246 -68 0 -rnode "VOUT.n479" 0 0 -1246 -68 0 -rnode "VOUT.n480" 0 0 -1246 0 0 -rnode "VOUT.n481" 0 0 -1246 0 0 -rnode "VOUT.n482" 0 0 -1246 68 0 -rnode "VOUT.n483" 0 0 -1246 68 0 -rnode "VOUT.n484" 0 0 -1246 136 0 -rnode "VOUT.n485" 0 0 -1246 136 0 -rnode "VOUT.n486" 0 0 -1205 165 0 -rnode "VOUT.n487" 0 0 -1246 204 0 -rnode "VOUT.n488" 0 0 -1246 204 0 -rnode "VOUT.n489" 0 0 -1246 272 0 -rnode "VOUT.n490" 0 0 -1246 272 0 -rnode "VOUT.n491" 0 0 -1246 340 0 -rnode "VOUT.n492" 0 0 -1246 340 0 -rnode "VOUT.n493" 0 0 -1246 408 0 -rnode "VOUT.n494" 0 0 -1246 408 0 -rnode "VOUT.n495" 0 0 -1246 476 0 -rnode "VOUT.n496" 0 0 -1246 476 0 -rnode "VOUT.n497" 0 0 -1246 544 0 -rnode "VOUT.n498" 0 0 -1246 544 0 -rnode "VOUT.n499" 0 0 -1246 612 0 -rnode "VOUT.n500" 0 0 -1246 612 0 -rnode "VOUT.n501" 0 0 -1246 680 0 -rnode "VOUT.n502" 0 0 -1246 680 0 -rnode "VOUT.n503" 0 0 -1246 748 0 -rnode "VOUT.n504" 0 0 -1246 748 0 -rnode "VOUT.n505" 0 0 -1246 816 0 -rnode "VOUT.n506" 0 0 -1246 816 0 -rnode "VOUT.n507" 0 0 -1246 884 0 -rnode "VOUT.n508" 0 0 -1246 952 0 -rnode "VOUT.n509" 0 0 -1246 952 0 -rnode "VOUT.n510" 0 0 -1246 952 0 -rnode "VOUT.n511" 0 0 -1246 1088 0 -rnode "VOUT.n512" 0 0 -1050 1229 0 -rnode "VOUT.n513" 0 0 -1050 1229 0 -rnode "VOUT.n514" 0 0 -1050 1229 0 -rnode "VOUT.n515" 0 0 -950 1229 0 -rnode "VOUT.n516" 0 0 -850 1229 0 -rnode "VOUT.n517" 0 0 -850 1229 0 -rnode "VOUT.n518" 0 0 -850 1229 0 -rnode "VOUT.t15" 0 0 -758 448 0 -rnode "VOUT.n519" 0 0 -750 1229 0 -rnode "VOUT.n520" 0 0 -650 1229 0 -rnode "VOUT.n521" 0 0 -650 1229 0 -rnode "VOUT.n522" 0 0 -650 1229 0 -rnode "VOUT.n523" 0 0 -550 1229 0 -rnode "VOUT.n524" 0 0 -450 1229 0 -rnode "VOUT.n525" 0 0 -450 1229 0 -rnode "VOUT.n526" 0 0 -450 1229 0 -rnode "VOUT.n527" 0 0 -350 1229 0 -rnode "VOUT.n528" 0 0 -250 1229 0 -rnode "VOUT.n529" 0 0 -250 1229 0 -rnode "VOUT.n530" 0 0 -250 1229 0 -rnode "VOUT.n531" 0 0 -150 1229 0 -rnode "VOUT.n532" 0 0 -50 1229 0 -rnode "VOUT.n533" 0 0 -50 1229 0 -rnode "VOUT.n534" 0 0 -50 1229 0 -rnode "VOUT.t3" 0 0 0 448 0 -rnode "VOUT.n535" 0 0 50 1229 0 -rnode "VOUT.n536" 0 0 150 1229 0 -rnode "VOUT.n537" 0 0 150 1229 0 -rnode "VOUT.n538" 0 0 150 1229 0 -rnode "VOUT.n539" 0 0 250 1229 0 -rnode "VOUT.n540" 0 0 350 1229 0 -rnode "VOUT.n541" 0 0 350 1229 0 -rnode "VOUT.n542" 0 0 350 1229 0 -rnode "VOUT.n543" 0 0 450 1229 0 -rnode "VOUT.n544" 0 0 550 1229 0 -rnode "VOUT.n545" 0 0 550 1229 0 -rnode "VOUT.n546" 0 0 550 1229 0 -rnode "VOUT.n547" 0 0 650 1229 0 -rnode "VOUT.n548" 0 0 750 1229 0 -rnode "VOUT.n549" 0 0 750 1229 0 -rnode "VOUT.n550" 0 0 750 1229 0 -rnode "VOUT.n551" 0 0 750 -1229 0 -rnode "VOUT.n552" 0 0 750 -1229 0 -rnode "VOUT.n553" 0 0 750 -1229 0 -rnode "VOUT.n554" 0 0 850 -1229 0 -rnode "VOUT.n555" 0 0 950 -1229 0 -rnode "VOUT.n556" 0 0 950 -1229 0 -rnode "VOUT.n557" 0 0 1050 -1229 0 -rnode "VOUT.n558" 0 0 1050 -1229 0 -rnode "VOUT.n559" 0 0 1246 -1088 0 -rnode "VOUT.n560" 0 0 1246 -1088 0 -rnode "VOUT.n561" 0 0 1246 -1020 0 -rnode "VOUT.n562" 0 0 1246 -1020 0 -rnode "VOUT.n563" 0 0 1246 -952 0 -rnode "VOUT.n564" 0 0 1246 -952 0 -rnode "VOUT.n565" 0 0 1205 -947 0 -rnode "VOUT.n566" 0 0 1246 -884 0 -rnode "VOUT.n567" 0 0 1246 -884 0 -rnode "VOUT.n568" 0 0 1246 -816 0 -rnode "VOUT.n569" 0 0 1246 -816 0 -rnode "VOUT.n570" 0 0 1246 -748 0 -rnode "VOUT.n571" 0 0 1246 -748 0 -rnode "VOUT.n572" 0 0 1246 -680 0 -rnode "VOUT.n573" 0 0 1246 -680 0 -rnode "VOUT.n574" 0 0 1246 -612 0 -rnode "VOUT.n575" 0 0 1246 -612 0 -rnode "VOUT.n576" 0 0 1246 -544 0 -rnode "VOUT.n577" 0 0 1246 -544 0 -rnode "VOUT.n578" 0 0 1246 -476 0 -rnode "VOUT.n579" 0 0 1246 -476 0 -rnode "VOUT.n580" 0 0 1246 -408 0 -rnode "VOUT.n581" 0 0 1246 -408 0 -rnode "VOUT.n582" 0 0 1246 -340 0 -rnode "VOUT.n583" 0 0 1246 -340 0 -rnode "VOUT.n584" 0 0 1246 -272 0 -rnode "VOUT.n585" 0 0 1246 -272 0 -rnode "VOUT.n586" 0 0 1246 -204 0 -rnode "VOUT.n587" 0 0 1246 -204 0 -rnode "VOUT.n588" 0 0 1246 -136 0 -rnode "VOUT.n589" 0 0 1246 -136 0 -rnode "VOUT.n590" 0 0 1246 -68 0 -rnode "VOUT.n591" 0 0 1246 -68 0 -rnode "VOUT.n592" 0 0 1246 0 0 -rnode "VOUT.n593" 0 0 1246 0 0 -rnode "VOUT.n594" 0 0 1246 68 0 -rnode "VOUT.n595" 0 0 1246 68 0 -rnode "VOUT.n596" 0 0 1246 136 0 -rnode "VOUT.n597" 0 0 1246 136 0 -rnode "VOUT.n598" 0 0 1205 165 0 -rnode "VOUT.n599" 0 0 1246 204 0 -rnode "VOUT.n600" 0 0 1246 204 0 -rnode "VOUT.n601" 0 0 1246 272 0 -rnode "VOUT.n602" 0 0 1246 272 0 -rnode "VOUT.n603" 0 0 1246 340 0 -rnode "VOUT.n604" 0 0 1246 340 0 -rnode "VOUT.n605" 0 0 1246 408 0 -rnode "VOUT.n606" 0 0 1246 408 0 -rnode "VOUT.n607" 0 0 1246 476 0 -rnode "VOUT.n608" 0 0 1246 476 0 -rnode "VOUT.n609" 0 0 1246 544 0 -rnode "VOUT.n610" 0 0 1246 544 0 -rnode "VOUT.n611" 0 0 1246 612 0 -rnode "VOUT.n612" 0 0 1246 612 0 -rnode "VOUT.n613" 0 0 1246 680 0 -rnode "VOUT.n614" 0 0 1246 680 0 -rnode "VOUT.n615" 0 0 1246 748 0 -rnode "VOUT.n616" 0 0 1246 748 0 -rnode "VOUT.n617" 0 0 1246 816 0 -rnode "VOUT.n618" 0 0 1246 816 0 -rnode "VOUT.n619" 0 0 1246 884 0 -rnode "VOUT.n620" 0 0 1246 884 0 -rnode "VOUT.n621" 0 0 1246 952 0 -rnode "VOUT.n622" 0 0 1246 1020 0 -rnode "VOUT.n623" 0 0 1246 1088 0 -rnode "VOUT.n624" 0 0 1246 1088 0 -rnode "VOUT.n625" 0 0 1246 1088 0 -rnode "VOUT.n626" 0 0 1246 1088 0 -rnode "VOUT.n627" 0 0 1432 918 0 -rnode "VOUT.n628" 0 0 1608 1029 0 -rnode "VOUT.n629" 0 0 1608 1029 0 -rnode "VOUT.n630" 0 0 1608 1029 0 -rnode "VOUT.n631" 0 0 1608 1029 0 -rnode "VOUT.n632" 0 0 1708 1029 0 -rnode "VOUT.n633" 0 0 1808 1029 0 -rnode "VOUT.n634" 0 0 1808 1029 0 -rnode "VOUT.n635" 0 0 1908 1029 0 -rnode "VOUT.n636" 0 0 2008 1029 0 -rnode "VOUT.n637" 0 0 2008 1029 0 -rnode "VOUT.n638" 0 0 2108 1029 0 -rnode "VOUT.n639" 0 0 2208 1029 0 -rnode "VOUT.n640" 0 0 2208 1029 0 -rnode "VOUT.n641" 0 0 2308 1029 0 -rnode "VOUT.n642" 0 0 2408 1029 0 -rnode "VOUT.n643" 0 0 2408 1029 0 -rnode "VBULK" 0 0 2508 1029 0 -resist "VOUT.n89" "VOUT.n88" 0.0247093 -resist "VOUT.n87" "VOUT" 0.07125 -resist "VBULK" "VOUT.n0" 0.125 -resist "VOUT.n632" "VOUT.n631" 0.152439 -resist "VOUT.n633" "VOUT.n632" 0.152439 -resist "VOUT.n633" "VOUT.n7" 0.152439 -resist "VOUT.n637" "VOUT.n7" 0.152439 -resist "VOUT.n638" "VOUT.n637" 0.152439 -resist "VOUT.n639" "VOUT.n638" 0.152439 -resist "VOUT.n639" "VOUT.n2" 0.152439 -resist "VOUT.n643" "VOUT.n2" 0.152439 -resist "VBULK" "VOUT.n643" 0.152439 -resist "VOUT.n260" "VOUT.n0" 0.152439 -resist "VOUT.n260" "VOUT.n259" 0.152439 -resist "VOUT.n259" "VOUT.n258" 0.152439 -resist "VOUT.n258" "VOUT.n129" 0.152439 -resist "VOUT.n242" "VOUT.n129" 0.152439 -resist "VOUT.n242" "VOUT.n241" 0.152439 -resist "VOUT.n241" "VOUT.n240" 0.152439 -resist "VOUT.n240" "VOUT.n142" 0.152439 -resist "VOUT.n225" "VOUT.n142" 0.152439 -resist "VOUT.n291" "VOUT.n108" 0.152439 -resist "VOUT.n279" "VOUT.n108" 0.152439 -resist "VOUT.n280" "VOUT.n279" 0.152439 -resist "VOUT.n281" "VOUT.n280" 0.152439 -resist "VOUT.n281" "VOUT.n278" 0.152439 -resist "VOUT.n278" "VOUT.n277" 0.152439 -resist "VOUT.n277" "VOUT.n116" 0.152439 -resist "VOUT.n269" "VOUT.n116" 0.152439 -resist "VOUT.n269" "VOUT.n268" 0.152439 -resist "VOUT.n268" "VOUT.n267" 0.152439 -resist "VOUT.n267" "VOUT.n122" 0.152439 -resist "VOUT.n251" "VOUT.n122" 0.152439 -resist "VOUT.n251" "VOUT.n250" 0.152439 -resist "VOUT.n250" "VOUT.n249" 0.152439 -resist "VOUT.n249" "VOUT.n136" 0.152439 -resist "VOUT.n233" "VOUT.n136" 0.152439 -resist "VOUT.n234" "VOUT.n233" 0.152439 -resist "VOUT.n234" "VOUT.n232" 0.152439 -resist "VOUT.n232" "VOUT.n231" 0.152439 -resist "VOUT.n383" "VOUT.n382" 0.152439 -resist "VOUT.n382" "VOUT.n381" 0.152439 -resist "VOUT.n381" "VOUT.n380" 0.152439 -resist "VOUT.n380" "VOUT.n372" 0.152439 -resist "VOUT.n372" "VOUT.n371" 0.152439 -resist "VOUT.n371" "VOUT.n370" 0.152439 -resist "VOUT.n370" "VOUT.n369" 0.152439 -resist "VOUT.n369" "VOUT.n361" 0.152439 -resist "VOUT.n361" "VOUT.n360" 0.152439 -resist "VOUT.n360" "VOUT.n359" 0.152439 -resist "VOUT.n359" "VOUT.n358" 0.152439 -resist "VOUT.n358" "VOUT.n350" 0.152439 -resist "VOUT.n350" "VOUT.n349" 0.152439 -resist "VOUT.n349" "VOUT.n348" 0.152439 -resist "VOUT.n348" "VOUT.n347" 0.152439 -resist "VOUT.n347" "VOUT.n339" 0.152439 -resist "VOUT.n339" "VOUT.n338" 0.152439 -resist "VOUT.n338" "VOUT.n337" 0.152439 -resist "VOUT.n337" "VOUT.n336" 0.152439 -resist "VOUT.n336" "VOUT.n335" 0.152439 -resist "VOUT.n335" "VOUT.n314" 0.152439 -resist "VOUT.n446" "VOUT.n409" 0.152439 -resist "VOUT.n441" "VOUT.n409" 0.152439 -resist "VOUT.n441" "VOUT.n440" 0.152439 -resist "VOUT.n440" "VOUT.n439" 0.152439 -resist "VOUT.n439" "VOUT.n411" 0.152439 -resist "VOUT.n434" "VOUT.n411" 0.152439 -resist "VOUT.n434" "VOUT.n433" 0.152439 -resist "VOUT.n433" "VOUT.n432" 0.152439 -resist "VOUT.n432" "VOUT.n413" 0.152439 -resist "VOUT.n427" "VOUT.n413" 0.152439 -resist "VOUT.n427" "VOUT.n426" 0.152439 -resist "VOUT.n426" "VOUT.n425" 0.152439 -resist "VOUT.n425" "VOUT.n415" 0.152439 -resist "VOUT.n420" "VOUT.n415" 0.152439 -resist "VOUT.n420" "VOUT.n419" 0.152439 -resist "VOUT.n419" "VOUT.n418" 0.152439 -resist "VOUT.n418" "VOUT.n322" 0.152439 -resist "VOUT.n553" "VOUT.n322" 0.152439 -resist "VOUT.n554" "VOUT.n553" 0.152439 -resist "VOUT.n555" "VOUT.n554" 0.152439 -resist "VOUT.n555" "VOUT.n319" 0.152439 -resist "VOUT.n56" "VOUT.n35" 0.780488 -resist "VOUT.n203" "VOUT.n202" 0.780488 -resist "VOUT.n565" "VOUT.n564" 0.780488 -resist "VOUT.n453" "VOUT.n452" 0.780488 -resist "VOUT.n91" "VOUT.n71" 2.18537 -resist "VOUT.n77" "VOUT.n73" 3.44721 -resist "VOUT.n84" "VOUT.n80" 3.44721 -resist "VOUT.n598" "VOUT.n597" 4.52683 -resist "VOUT.n486" "VOUT.n485" 4.52683 -resist "VOUT.n104" "VOUT.n103" 5.15122 -resist "VOUT.n177" "VOUT.n169" 5.15122 -resist "VOUT.n87" "VOUT.n86" 5.15589 -resist "VOUT.n106" "VOUT.n104" 5.46341 -resist "VOUT.n173" "VOUT.n169" 5.46341 -resist "VOUT.n76" "VOUT.n72" 5.81818 -resist "VOUT.n83" "VOUT.n79" 5.81818 -resist "VOUT.n599" "VOUT.n598" 6.0878 -resist "VOUT.n487" "VOUT.n486" 6.0878 -resist "VOUT.n76" "VOUT.n75" 7.3697 -resist "VOUT.n83" "VOUT.n82" 7.3697 -resist "VOUT.n78" "VOUT.n72" 8.14545 -resist "VOUT.n85" "VOUT.n79" 8.14545 -resist "VOUT.n92" "VOUT.n91" 8.42927 -resist "VOUT.n631" "VOUT.n630" 9.3 -resist "VOUT.n632" "VOUT.n11" 9.3 -resist "VOUT.n634" "VOUT.n633" 9.3 -resist "VOUT.n635" "VOUT.n7" 9.3 -resist "VOUT.n637" "VOUT.n636" 9.3 -resist "VOUT.n638" "VOUT.n6" 9.3 -resist "VOUT.n640" "VOUT.n639" 9.3 -resist "VOUT.n641" "VOUT.n2" 9.3 -resist "VOUT.n643" "VOUT.n642" 9.3 -resist "VBULK" "VOUT.n1" 9.3 -resist "VOUT.n226" "VOUT.n225" 9.3 -resist "VOUT.n262" "VOUT.n0" 9.3 -resist "VOUT.n261" "VOUT.n260" 9.3 -resist "VOUT.n259" "VOUT.n128" 9.3 -resist "VOUT.n258" "VOUT.n257" 9.3 -resist "VOUT.n130" "VOUT.n129" 9.3 -resist "VOUT.n243" "VOUT.n242" 9.3 -resist "VOUT.n241" "VOUT.n141" 9.3 -resist "VOUT.n240" "VOUT.n239" 9.3 -resist "VOUT.n143" "VOUT.n142" 9.3 -resist "VOUT.n231" "VOUT.n230" 9.3 -resist "VOUT.n291" "VOUT.n290" 9.3 -resist "VOUT.n289" "VOUT.n108" 9.3 -resist "VOUT.n279" "VOUT.n109" 9.3 -resist "VOUT.n280" "VOUT.n115" 9.3 -resist "VOUT.n282" "VOUT.n281" 9.3 -resist "VOUT.n278" "VOUT.n114" 9.3 -resist "VOUT.n277" "VOUT.n276" 9.3 -resist "VOUT.n117" "VOUT.n116" 9.3 -resist "VOUT.n270" "VOUT.n269" 9.3 -resist "VOUT.n268" "VOUT.n121" 9.3 -resist "VOUT.n267" "VOUT.n266" 9.3 -resist "VOUT.n123" "VOUT.n122" 9.3 -resist "VOUT.n252" "VOUT.n251" 9.3 -resist "VOUT.n250" "VOUT.n135" 9.3 -resist "VOUT.n249" "VOUT.n248" 9.3 -resist "VOUT.n137" "VOUT.n136" 9.3 -resist "VOUT.n233" "VOUT.n148" 9.3 -resist "VOUT.n235" "VOUT.n234" 9.3 -resist "VOUT.n232" "VOUT.n147" 9.3 -resist "VOUT.n514" "VOUT.n383" 9.3 -resist "VOUT.n515" "VOUT.n382" 9.3 -resist "VOUT.n516" "VOUT.n381" 9.3 -resist "VOUT.n380" "VOUT.n373" 9.3 -resist "VOUT.n522" "VOUT.n372" 9.3 -resist "VOUT.n523" "VOUT.n371" 9.3 -resist "VOUT.n524" "VOUT.n370" 9.3 -resist "VOUT.n369" "VOUT.n362" 9.3 -resist "VOUT.n530" "VOUT.n361" 9.3 -resist "VOUT.n531" "VOUT.n360" 9.3 -resist "VOUT.n532" "VOUT.n359" 9.3 -resist "VOUT.n358" "VOUT.n351" 9.3 -resist "VOUT.n538" "VOUT.n350" 9.3 -resist "VOUT.n539" "VOUT.n349" 9.3 -resist "VOUT.n540" "VOUT.n348" 9.3 -resist "VOUT.n347" "VOUT.n340" 9.3 -resist "VOUT.n546" "VOUT.n339" 9.3 -resist "VOUT.n547" "VOUT.n338" 9.3 -resist "VOUT.n548" "VOUT.n337" 9.3 -resist "VOUT.n336" "VOUT.n329" 9.3 -resist "VOUT.n335" "VOUT.n334" 9.3 -resist "VOUT.n330" "VOUT.n314" 9.3 -resist "VOUT.n557" "VOUT.n319" 9.3 -resist "VOUT.n446" "VOUT.n445" 9.3 -resist "VOUT.n444" "VOUT.n409" 9.3 -resist "VOUT.n442" "VOUT.n441" 9.3 -resist "VOUT.n440" "VOUT.n410" 9.3 -resist "VOUT.n439" "VOUT.n438" 9.3 -resist "VOUT.n437" "VOUT.n411" 9.3 -resist "VOUT.n435" "VOUT.n434" 9.3 -resist "VOUT.n433" "VOUT.n412" 9.3 -resist "VOUT.n432" "VOUT.n431" 9.3 -resist "VOUT.n430" "VOUT.n413" 9.3 -resist "VOUT.n428" "VOUT.n427" 9.3 -resist "VOUT.n426" "VOUT.n414" 9.3 -resist "VOUT.n425" "VOUT.n424" 9.3 -resist "VOUT.n423" "VOUT.n415" 9.3 -resist "VOUT.n421" "VOUT.n420" 9.3 -resist "VOUT.n419" "VOUT.n416" 9.3 -resist "VOUT.n418" "VOUT.n417" 9.3 -resist "VOUT.n323" "VOUT.n322" 9.3 -resist "VOUT.n553" "VOUT.n552" 9.3 -resist "VOUT.n554" "VOUT.n321" 9.3 -resist "VOUT.n556" "VOUT.n555" 9.3 -resist "VOUT.n77" "VOUT.n76" 9.3 -resist "VOUT.n84" "VOUT.n83" 9.3 -resist "VOUT.n78" "VOUT.n77" 9.45517 -resist "VOUT.n85" "VOUT.n84" 9.45517 -resist "VOUT.n75" "VOUT.n73" 9.71124 -resist "VOUT.n82" "VOUT.n80" 9.71124 -resist "VOUT.n59" "VOUT.n35" 9.83415 -resist "VOUT.n202" "VOUT.n201" 9.83415 -resist "VOUT.n566" "VOUT.n565" 9.83415 -resist "VOUT.n454" "VOUT.n453" 9.83415 -resist "VOUT.n292" "VOUT.n107" 10.6146 -resist "VOUT.n107" "VOUT.n106" 10.6146 -resist "VOUT.n103" "VOUT.n100" 10.6146 -resist "VOUT.n100" "VOUT.n99" 10.6146 -resist "VOUT.n99" "VOUT.n96" 10.6146 -resist "VOUT.n96" "VOUT.n95" 10.6146 -resist "VOUT.n95" "VOUT.n92" 10.6146 -resist "VOUT.n71" "VOUT.n68" 10.6146 -resist "VOUT.n68" "VOUT.n67" 10.6146 -resist "VOUT.n67" "VOUT.n64" 10.6146 -resist "VOUT.n64" "VOUT.n63" 10.6146 -resist "VOUT.n63" "VOUT.n60" 10.6146 -resist "VOUT.n60" "VOUT.n59" 10.6146 -resist "VOUT.n56" "VOUT.n55" 10.6146 -resist "VOUT.n55" "VOUT.n52" 10.6146 -resist "VOUT.n52" "VOUT.n51" 10.6146 -resist "VOUT.n51" "VOUT.n48" 10.6146 -resist "VOUT.n48" "VOUT.n47" 10.6146 -resist "VOUT.n47" "VOUT.n44" 10.6146 -resist "VOUT.n44" "VOUT.n43" 10.6146 -resist "VOUT.n43" "VOUT.n40" 10.6146 -resist "VOUT.n40" "VOUT.n39" 10.6146 -resist "VOUT.n39" "VOUT.n36" 10.6146 -resist "VOUT.n36" "VOUT.n12" 10.6146 -resist "VOUT.n172" "VOUT.n149" 10.6146 -resist "VOUT.n173" "VOUT.n172" 10.6146 -resist "VOUT.n178" "VOUT.n177" 10.6146 -resist "VOUT.n179" "VOUT.n178" 10.6146 -resist "VOUT.n179" "VOUT.n165" 10.6146 -resist "VOUT.n185" "VOUT.n165" 10.6146 -resist "VOUT.n186" "VOUT.n185" 10.6146 -resist "VOUT.n187" "VOUT.n186" 10.6146 -resist "VOUT.n187" "VOUT.n163" 10.6146 -resist "VOUT.n193" "VOUT.n163" 10.6146 -resist "VOUT.n194" "VOUT.n193" 10.6146 -resist "VOUT.n195" "VOUT.n194" 10.6146 -resist "VOUT.n195" "VOUT.n161" 10.6146 -resist "VOUT.n201" "VOUT.n161" 10.6146 -resist "VOUT.n204" "VOUT.n203" 10.6146 -resist "VOUT.n204" "VOUT.n157" 10.6146 -resist "VOUT.n210" "VOUT.n157" 10.6146 -resist "VOUT.n211" "VOUT.n210" 10.6146 -resist "VOUT.n212" "VOUT.n211" 10.6146 -resist "VOUT.n212" "VOUT.n155" 10.6146 -resist "VOUT.n217" "VOUT.n155" 10.6146 -resist "VOUT.n218" "VOUT.n217" 10.6146 -resist "VOUT.n218" "VOUT.n153" 10.6146 -resist "VOUT.n223" "VOUT.n153" 10.6146 -resist "VOUT.n224" "VOUT.n223" 10.6146 -resist "VOUT.n561" "VOUT.n560" 10.6146 -resist "VOUT.n564" "VOUT.n561" 10.6146 -resist "VOUT.n569" "VOUT.n566" 10.6146 -resist "VOUT.n570" "VOUT.n569" 10.6146 -resist "VOUT.n573" "VOUT.n570" 10.6146 -resist "VOUT.n574" "VOUT.n573" 10.6146 -resist "VOUT.n577" "VOUT.n574" 10.6146 -resist "VOUT.n578" "VOUT.n577" 10.6146 -resist "VOUT.n581" "VOUT.n578" 10.6146 -resist "VOUT.n582" "VOUT.n581" 10.6146 -resist "VOUT.n585" "VOUT.n582" 10.6146 -resist "VOUT.n586" "VOUT.n585" 10.6146 -resist "VOUT.n589" "VOUT.n586" 10.6146 -resist "VOUT.n590" "VOUT.n589" 10.6146 -resist "VOUT.n593" "VOUT.n590" 10.6146 -resist "VOUT.n594" "VOUT.n593" 10.6146 -resist "VOUT.n597" "VOUT.n594" 10.6146 -resist "VOUT.n602" "VOUT.n599" 10.6146 -resist "VOUT.n603" "VOUT.n602" 10.6146 -resist "VOUT.n606" "VOUT.n603" 10.6146 -resist "VOUT.n607" "VOUT.n606" 10.6146 -resist "VOUT.n610" "VOUT.n607" 10.6146 -resist "VOUT.n611" "VOUT.n610" 10.6146 -resist "VOUT.n614" "VOUT.n611" 10.6146 -resist "VOUT.n615" "VOUT.n614" 10.6146 -resist "VOUT.n618" "VOUT.n615" 10.6146 -resist "VOUT.n620" "VOUT.n618" 10.6146 -resist "VOUT.n621" "VOUT.n620" 10.6146 -resist "VOUT.n622" "VOUT.n621" 10.6146 -resist "VOUT.n623" "VOUT.n622" 10.6146 -resist "VOUT.n449" "VOUT.n448" 10.6146 -resist "VOUT.n452" "VOUT.n449" 10.6146 -resist "VOUT.n457" "VOUT.n454" 10.6146 -resist "VOUT.n458" "VOUT.n457" 10.6146 -resist "VOUT.n461" "VOUT.n458" 10.6146 -resist "VOUT.n462" "VOUT.n461" 10.6146 -resist "VOUT.n465" "VOUT.n462" 10.6146 -resist "VOUT.n466" "VOUT.n465" 10.6146 -resist "VOUT.n469" "VOUT.n466" 10.6146 -resist "VOUT.n470" "VOUT.n469" 10.6146 -resist "VOUT.n473" "VOUT.n470" 10.6146 -resist "VOUT.n474" "VOUT.n473" 10.6146 -resist "VOUT.n477" "VOUT.n474" 10.6146 -resist "VOUT.n478" "VOUT.n477" 10.6146 -resist "VOUT.n481" "VOUT.n478" 10.6146 -resist "VOUT.n482" "VOUT.n481" 10.6146 -resist "VOUT.n485" "VOUT.n482" 10.6146 -resist "VOUT.n490" "VOUT.n487" 10.6146 -resist "VOUT.n491" "VOUT.n490" 10.6146 -resist "VOUT.n494" "VOUT.n491" 10.6146 -resist "VOUT.n495" "VOUT.n494" 10.6146 -resist "VOUT.n498" "VOUT.n495" 10.6146 -resist "VOUT.n499" "VOUT.n498" 10.6146 -resist "VOUT.n502" "VOUT.n499" 10.6146 -resist "VOUT.n503" "VOUT.n502" 10.6146 -resist "VOUT.n506" "VOUT.n503" 10.6146 -resist "VOUT.n507" "VOUT.n506" 10.6146 -resist "VOUT.n508" "VOUT.n507" 10.6146 -resist "VOUT.n508" "VOUT.n404" 10.6146 -resist "VOUT.n404" "VOUT.n403" 10.6146 -resist "VOUT.n519" "VOUT.t15" 12.9317 -resist "VOUT.n550" "VOUT.t7" 12.9317 -resist "VOUT.n88" "VOUT.n87" 13.0405 -resist "VOUT.n90" "VOUT.n89" 18.0633 -resist "VOUT.n290" "VOUT.n289" 19.3939 -resist "VOUT.n289" "VOUT.n109" 19.3939 -resist "VOUT.n115" "VOUT.n109" 19.3939 -resist "VOUT.n282" "VOUT.n115" 19.3939 -resist "VOUT.n282" "VOUT.n114" 19.3939 -resist "VOUT.n276" "VOUT.n114" 19.3939 -resist "VOUT.n276" "VOUT.n117" 19.3939 -resist "VOUT.n270" "VOUT.n117" 19.3939 -resist "VOUT.n270" "VOUT.n121" 19.3939 -resist "VOUT.n266" "VOUT.n121" 19.3939 -resist "VOUT.n266" "VOUT.n123" 19.3939 -resist "VOUT.n252" "VOUT.n123" 19.3939 -resist "VOUT.n252" "VOUT.n135" 19.3939 -resist "VOUT.n248" "VOUT.n135" 19.3939 -resist "VOUT.n248" "VOUT.n137" 19.3939 -resist "VOUT.n148" "VOUT.n137" 19.3939 -resist "VOUT.n235" "VOUT.n148" 19.3939 -resist "VOUT.n235" "VOUT.n147" 19.3939 -resist "VOUT.n230" "VOUT.n147" 19.3939 -resist "VOUT.n630" "VOUT.n11" 19.3939 -resist "VOUT.n634" "VOUT.n11" 19.3939 -resist "VOUT.n635" "VOUT.n634" 19.3939 -resist "VOUT.n636" "VOUT.n635" 19.3939 -resist "VOUT.n636" "VOUT.n6" 19.3939 -resist "VOUT.n640" "VOUT.n6" 19.3939 -resist "VOUT.n641" "VOUT.n640" 19.3939 -resist "VOUT.n642" "VOUT.n641" 19.3939 -resist "VOUT.n642" "VOUT.n1" 19.3939 -resist "VOUT.n262" "VOUT.n1" 19.3939 -resist "VOUT.n262" "VOUT.n261" 19.3939 -resist "VOUT.n261" "VOUT.n128" 19.3939 -resist "VOUT.n257" "VOUT.n128" 19.3939 -resist "VOUT.n257" "VOUT.n130" 19.3939 -resist "VOUT.n243" "VOUT.n130" 19.3939 -resist "VOUT.n243" "VOUT.n141" 19.3939 -resist "VOUT.n239" "VOUT.n141" 19.3939 -resist "VOUT.n239" "VOUT.n143" 19.3939 -resist "VOUT.n226" "VOUT.n143" 19.3939 -resist "VOUT.n445" "VOUT.n444" 19.3939 -resist "VOUT.n444" "VOUT.n442" 19.3939 -resist "VOUT.n442" "VOUT.n410" 19.3939 -resist "VOUT.n438" "VOUT.n410" 19.3939 -resist "VOUT.n438" "VOUT.n437" 19.3939 -resist "VOUT.n437" "VOUT.n435" 19.3939 -resist "VOUT.n435" "VOUT.n412" 19.3939 -resist "VOUT.n431" "VOUT.n412" 19.3939 -resist "VOUT.n431" "VOUT.n430" 19.3939 -resist "VOUT.n430" "VOUT.n428" 19.3939 -resist "VOUT.n428" "VOUT.n414" 19.3939 -resist "VOUT.n424" "VOUT.n414" 19.3939 -resist "VOUT.n424" "VOUT.n423" 19.3939 -resist "VOUT.n423" "VOUT.n421" 19.3939 -resist "VOUT.n421" "VOUT.n416" 19.3939 -resist "VOUT.n417" "VOUT.n416" 19.3939 -resist "VOUT.n417" "VOUT.n323" 19.3939 -resist "VOUT.n552" "VOUT.n323" 19.3939 -resist "VOUT.n552" "VOUT.n321" 19.3939 -resist "VOUT.n556" "VOUT.n321" 19.3939 -resist "VOUT.n557" "VOUT.n556" 19.3939 -resist "VOUT.n515" "VOUT.n514" 19.3939 -resist "VOUT.n516" "VOUT.n515" 19.3939 -resist "VOUT.n516" "VOUT.n373" 19.3939 -resist "VOUT.n522" "VOUT.n373" 19.3939 -resist "VOUT.n523" "VOUT.n522" 19.3939 -resist "VOUT.n524" "VOUT.n523" 19.3939 -resist "VOUT.n524" "VOUT.n362" 19.3939 -resist "VOUT.n530" "VOUT.n362" 19.3939 -resist "VOUT.n531" "VOUT.n530" 19.3939 -resist "VOUT.n532" "VOUT.n531" 19.3939 -resist "VOUT.n532" "VOUT.n351" 19.3939 -resist "VOUT.n538" "VOUT.n351" 19.3939 -resist "VOUT.n539" "VOUT.n538" 19.3939 -resist "VOUT.n540" "VOUT.n539" 19.3939 -resist "VOUT.n540" "VOUT.n340" 19.3939 -resist "VOUT.n546" "VOUT.n340" 19.3939 -resist "VOUT.n547" "VOUT.n546" 19.3939 -resist "VOUT.n548" "VOUT.n547" 19.3939 -resist "VOUT.n548" "VOUT.n329" 19.3939 -resist "VOUT.n334" "VOUT.n329" 19.3939 -resist "VOUT.n334" "VOUT.n330" 19.3939 -resist "VOUT.n292" "VOUT.n291" 26.8951 -resist "VOUT.n631" "VOUT.n12" 26.8951 -resist "VOUT.n231" "VOUT.n149" 26.8951 -resist "VOUT.n225" "VOUT.n224" 26.8951 -resist "VOUT.n560" "VOUT.n319" 31.6085 -resist "VOUT.n623" "VOUT.n314" 31.6085 -resist "VOUT.n448" "VOUT.n446" 31.6085 -resist "VOUT.n403" "VOUT.n383" 31.6085 -resist "VOUT.n104" "VOUT.n32" 34.3273 -resist "VOUT.n35" "VOUT.n34" 34.3273 -resist "VOUT.n202" "VOUT.n160" 34.3273 -resist "VOUT.n169" "VOUT.n168" 34.3273 -resist "VOUT.n598" "VOUT.n316" 34.3273 -resist "VOUT.n565" "VOUT.n318" 34.3273 -resist "VOUT.n453" "VOUT.n408" 34.3273 -resist "VOUT.n486" "VOUT.n406" 34.3273 -resist "VOUT.n32" "VOUT.n31" 44.6061 -resist "VOUT.n34" "VOUT.n33" 44.6061 -resist "VOUT.n160" "VOUT.n159" 44.6061 -resist "VOUT.n168" "VOUT.n167" 44.6061 -resist "VOUT.t11" "VOUT.n285" 45.2608 -resist "VOUT.t25" "VOUT.n139" 45.2608 -resist "VOUT.n86" "VOUT.n85" 48.0879 -resist "VOUT.n74" "VOUT.t5" 52.3077 -resist "VOUT.n81" "VOUT.t4" 52.3077 -resist "VOUT.n316" "VOUT.n315" 52.3636 -resist "VOUT.n318" "VOUT.n317" 52.3636 -resist "VOUT.n408" "VOUT.n407" 52.3636 -resist "VOUT.n406" "VOUT.n405" 52.3636 -resist "VOUT.n86" "VOUT.n78" 58.1626 -resist "VOUT.n17" "VOUT.n14" 71.6755 -resist "VOUT.n38" "VOUT.n18" 71.6755 -resist "VOUT.n42" "VOUT.n19" 71.6755 -resist "VOUT.n46" "VOUT.n20" 71.6755 -resist "VOUT.n50" "VOUT.n21" 71.6755 -resist "VOUT.n54" "VOUT.n22" 71.6755 -resist "VOUT.n58" "VOUT.n23" 71.6755 -resist "VOUT.n62" "VOUT.n24" 71.6755 -resist "VOUT.n66" "VOUT.n25" 71.6755 -resist "VOUT.n70" "VOUT.n26" 71.6755 -resist "VOUT.n94" "VOUT.n27" 71.6755 -resist "VOUT.n98" "VOUT.n28" 71.6755 -resist "VOUT.n102" "VOUT.n29" 71.6755 -resist "VOUT.n294" "VOUT.n30" 71.6755 -resist "VOUT.n171" "VOUT.n170" 71.6755 -resist "VOUT.n176" "VOUT.n175" 71.6755 -resist "VOUT.n181" "VOUT.n180" 71.6755 -resist "VOUT.n184" "VOUT.n183" 71.6755 -resist "VOUT.n189" "VOUT.n188" 71.6755 -resist "VOUT.n192" "VOUT.n191" 71.6755 -resist "VOUT.n197" "VOUT.n196" 71.6755 -resist "VOUT.n200" "VOUT.n199" 71.6755 -resist "VOUT.n206" "VOUT.n205" 71.6755 -resist "VOUT.n209" "VOUT.n208" 71.6755 -resist "VOUT.n214" "VOUT.n213" 71.6755 -resist "VOUT.n216" "VOUT.n154" 71.6755 -resist "VOUT.n222" "VOUT.n221" 71.6755 -resist "VOUT.n294" "VOUT.n293" 71.6755 -resist "VOUT.n105" "VOUT.n29" 71.6755 -resist "VOUT.n101" "VOUT.n28" 71.6755 -resist "VOUT.n97" "VOUT.n27" 71.6755 -resist "VOUT.n93" "VOUT.n26" 71.6755 -resist "VOUT.n69" "VOUT.n25" 71.6755 -resist "VOUT.n65" "VOUT.n24" 71.6755 -resist "VOUT.n61" "VOUT.n23" 71.6755 -resist "VOUT.n57" "VOUT.n22" 71.6755 -resist "VOUT.n53" "VOUT.n21" 71.6755 -resist "VOUT.n49" "VOUT.n20" 71.6755 -resist "VOUT.n45" "VOUT.n19" 71.6755 -resist "VOUT.n41" "VOUT.n18" 71.6755 -resist "VOUT.n37" "VOUT.n17" 71.6755 -resist "VOUT.n174" "VOUT.n170" 71.6755 -resist "VOUT.n175" "VOUT.n166" 71.6755 -resist "VOUT.n182" "VOUT.n181" 71.6755 -resist "VOUT.n183" "VOUT.n164" 71.6755 -resist "VOUT.n190" "VOUT.n189" 71.6755 -resist "VOUT.n191" "VOUT.n162" 71.6755 -resist "VOUT.n198" "VOUT.n197" 71.6755 -resist "VOUT.n199" "VOUT.n158" 71.6755 -resist "VOUT.n207" "VOUT.n206" 71.6755 -resist "VOUT.n208" "VOUT.n156" 71.6755 -resist "VOUT.n215" "VOUT.n214" 71.6755 -resist "VOUT.n219" "VOUT.n154" 71.6755 -resist "VOUT.n221" "VOUT.n152" 71.6755 -resist "VOUT.n510" "VOUT.n401" 71.6755 -resist "VOUT.n402" "VOUT.n400" 71.6755 -resist "VOUT.n504" "VOUT.n399" 71.6755 -resist "VOUT.n500" "VOUT.n398" 71.6755 -resist "VOUT.n496" "VOUT.n397" 71.6755 -resist "VOUT.n492" "VOUT.n396" 71.6755 -resist "VOUT.n488" "VOUT.n395" 71.6755 -resist "VOUT.n483" "VOUT.n394" 71.6755 -resist "VOUT.n479" "VOUT.n393" 71.6755 -resist "VOUT.n475" "VOUT.n392" 71.6755 -resist "VOUT.n471" "VOUT.n391" 71.6755 -resist "VOUT.n467" "VOUT.n390" 71.6755 -resist "VOUT.n463" "VOUT.n389" 71.6755 -resist "VOUT.n459" "VOUT.n388" 71.6755 -resist "VOUT.n455" "VOUT.n387" 71.6755 -resist "VOUT.n450" "VOUT.n386" 71.6755 -resist "VOUT.n559" "VOUT.n309" 71.6755 -resist "VOUT.n563" "VOUT.n308" 71.6755 -resist "VOUT.n568" "VOUT.n307" 71.6755 -resist "VOUT.n572" "VOUT.n306" 71.6755 -resist "VOUT.n576" "VOUT.n305" 71.6755 -resist "VOUT.n580" "VOUT.n304" 71.6755 -resist "VOUT.n584" "VOUT.n303" 71.6755 -resist "VOUT.n588" "VOUT.n302" 71.6755 -resist "VOUT.n592" "VOUT.n301" 71.6755 -resist "VOUT.n596" "VOUT.n300" 71.6755 -resist "VOUT.n601" "VOUT.n299" 71.6755 -resist "VOUT.n605" "VOUT.n298" 71.6755 -resist "VOUT.n609" "VOUT.n297" 71.6755 -resist "VOUT.n613" "VOUT.n296" 71.6755 -resist "VOUT.n617" "VOUT.n295" 71.6755 -resist "VOUT.n625" "VOUT.n312" 71.6755 -resist "VOUT.n562" "VOUT.n309" 71.6755 -resist "VOUT.n567" "VOUT.n308" 71.6755 -resist "VOUT.n571" "VOUT.n307" 71.6755 -resist "VOUT.n575" "VOUT.n306" 71.6755 -resist "VOUT.n579" "VOUT.n305" 71.6755 -resist "VOUT.n583" "VOUT.n304" 71.6755 -resist "VOUT.n587" "VOUT.n303" 71.6755 -resist "VOUT.n591" "VOUT.n302" 71.6755 -resist "VOUT.n595" "VOUT.n301" 71.6755 -resist "VOUT.n600" "VOUT.n300" 71.6755 -resist "VOUT.n604" "VOUT.n299" 71.6755 -resist "VOUT.n608" "VOUT.n298" 71.6755 -resist "VOUT.n612" "VOUT.n297" 71.6755 -resist "VOUT.n616" "VOUT.n296" 71.6755 -resist "VOUT.n619" "VOUT.n295" 71.6755 -resist "VOUT.n625" "VOUT.n624" 71.6755 -resist "VOUT.n447" "VOUT.n386" 71.6755 -resist "VOUT.n451" "VOUT.n387" 71.6755 -resist "VOUT.n456" "VOUT.n388" 71.6755 -resist "VOUT.n460" "VOUT.n389" 71.6755 -resist "VOUT.n464" "VOUT.n390" 71.6755 -resist "VOUT.n468" "VOUT.n391" 71.6755 -resist "VOUT.n472" "VOUT.n392" 71.6755 -resist "VOUT.n476" "VOUT.n393" 71.6755 -resist "VOUT.n480" "VOUT.n394" 71.6755 -resist "VOUT.n484" "VOUT.n395" 71.6755 -resist "VOUT.n489" "VOUT.n396" 71.6755 -resist "VOUT.n493" "VOUT.n397" 71.6755 -resist "VOUT.n497" "VOUT.n398" 71.6755 -resist "VOUT.n501" "VOUT.n399" 71.6755 -resist "VOUT.n505" "VOUT.n400" 71.6755 -resist "VOUT.n510" "VOUT.n509" 71.6755 -resist "VOUT.t3" "VOUT.n534" 80.8229 -resist "VOUT.n535" "VOUT.t3" 80.8229 -resist "VOUT.t0" "VOUT.n119" 80.8229 -resist "VOUT.n264" "VOUT.t0" 80.8229 -resist "VOUT.n91" "VOUT.n90" 88.0894 -resist "VOUT.n286" "VOUT.t11" 116.385 -resist "VOUT.n237" "VOUT.t25" 116.385 -resist "VOUT.n316" "VOUT.t8" 123.018 -resist "VOUT.n318" "VOUT.t22" 123.018 -resist "VOUT.n408" "VOUT.t20" 123.018 -resist "VOUT.n406" "VOUT.t17" 123.018 -resist "VOUT.t15" "VOUT.n518" 148.714 -resist "VOUT.n331" "VOUT.t7" 148.714 -resist "VOUT.n512" "VOUT.n378" 161.646 -resist "VOUT.n518" "VOUT.n378" 161.646 -resist "VOUT.n520" "VOUT.n519" 161.646 -resist "VOUT.n520" "VOUT.n367" 161.646 -resist "VOUT.n526" "VOUT.n367" 161.646 -resist "VOUT.n527" "VOUT.n526" 161.646 -resist "VOUT.n528" "VOUT.n527" 161.646 -resist "VOUT.n528" "VOUT.n356" 161.646 -resist "VOUT.n534" "VOUT.n356" 161.646 -resist "VOUT.n536" "VOUT.n535" 161.646 -resist "VOUT.n536" "VOUT.n345" 161.646 -resist "VOUT.n542" "VOUT.n345" 161.646 -resist "VOUT.n543" "VOUT.n542" 161.646 -resist "VOUT.n544" "VOUT.n543" 161.646 -resist "VOUT.n544" "VOUT.n326" 161.646 -resist "VOUT.n550" "VOUT.n326" 161.646 -resist "VOUT.n332" "VOUT.n331" 161.646 -resist "VOUT.n332" "VOUT.n310" 161.646 -resist "VOUT.n628" "VOUT.n15" 161.646 -resist "VOUT.n286" "VOUT.n15" 161.646 -resist "VOUT.n285" "VOUT.n284" 161.646 -resist "VOUT.n284" "VOUT.n112" 161.646 -resist "VOUT.n274" "VOUT.n112" 161.646 -resist "VOUT.n274" "VOUT.n273" 161.646 -resist "VOUT.n273" "VOUT.n272" 161.646 -resist "VOUT.n272" "VOUT.n119" 161.646 -resist "VOUT.n264" "VOUT.n125" 161.646 -resist "VOUT.n254" "VOUT.n125" 161.646 -resist "VOUT.n255" "VOUT.n254" 161.646 -resist "VOUT.n255" "VOUT.n133" 161.646 -resist "VOUT.n245" "VOUT.n133" 161.646 -resist "VOUT.n245" "VOUT.n139" 161.646 -resist "VOUT.n237" "VOUT.n145" 161.646 -resist "VOUT.n228" "VOUT.n145" 161.646 -resist "VOUT.n105" "VOUT.n30" 163.366 -resist "VOUT.n102" "VOUT.n101" 163.366 -resist "VOUT.n98" "VOUT.n97" 163.366 -resist "VOUT.n94" "VOUT.n93" 163.366 -resist "VOUT.n70" "VOUT.n69" 163.366 -resist "VOUT.n66" "VOUT.n65" 163.366 -resist "VOUT.n62" "VOUT.n61" 163.366 -resist "VOUT.n58" "VOUT.n57" 163.366 -resist "VOUT.n54" "VOUT.n53" 163.366 -resist "VOUT.n50" "VOUT.n49" 163.366 -resist "VOUT.n46" "VOUT.n45" 163.366 -resist "VOUT.n42" "VOUT.n41" 163.366 -resist "VOUT.n38" "VOUT.n37" 163.366 -resist "VOUT.n171" "VOUT.n150" 163.366 -resist "VOUT.n176" "VOUT.n174" 163.366 -resist "VOUT.n180" "VOUT.n166" 163.366 -resist "VOUT.n184" "VOUT.n182" 163.366 -resist "VOUT.n188" "VOUT.n164" 163.366 -resist "VOUT.n192" "VOUT.n190" 163.366 -resist "VOUT.n196" "VOUT.n162" 163.366 -resist "VOUT.n200" "VOUT.n198" 163.366 -resist "VOUT.n205" "VOUT.n158" 163.366 -resist "VOUT.n209" "VOUT.n207" 163.366 -resist "VOUT.n213" "VOUT.n156" 163.366 -resist "VOUT.n216" "VOUT.n215" 163.366 -resist "VOUT.n220" "VOUT.n219" 163.366 -resist "VOUT.n222" "VOUT.n220" 163.366 -resist "VOUT.n563" "VOUT.n562" 163.366 -resist "VOUT.n568" "VOUT.n567" 163.366 -resist "VOUT.n572" "VOUT.n571" 163.366 -resist "VOUT.n576" "VOUT.n575" 163.366 -resist "VOUT.n580" "VOUT.n579" 163.366 -resist "VOUT.n584" "VOUT.n583" 163.366 -resist "VOUT.n588" "VOUT.n587" 163.366 -resist "VOUT.n592" "VOUT.n591" 163.366 -resist "VOUT.n596" "VOUT.n595" 163.366 -resist "VOUT.n601" "VOUT.n600" 163.366 -resist "VOUT.n605" "VOUT.n604" 163.366 -resist "VOUT.n609" "VOUT.n608" 163.366 -resist "VOUT.n613" "VOUT.n612" 163.366 -resist "VOUT.n617" "VOUT.n616" 163.366 -resist "VOUT.n619" "VOUT.n311" 163.366 -resist "VOUT.n312" "VOUT.n311" 163.366 -resist "VOUT.n451" "VOUT.n450" 163.366 -resist "VOUT.n456" "VOUT.n455" 163.366 -resist "VOUT.n460" "VOUT.n459" 163.366 -resist "VOUT.n464" "VOUT.n463" 163.366 -resist "VOUT.n468" "VOUT.n467" 163.366 -resist "VOUT.n472" "VOUT.n471" 163.366 -resist "VOUT.n476" "VOUT.n475" 163.366 -resist "VOUT.n480" "VOUT.n479" 163.366 -resist "VOUT.n484" "VOUT.n483" 163.366 -resist "VOUT.n489" "VOUT.n488" 163.366 -resist "VOUT.n493" "VOUT.n492" 163.366 -resist "VOUT.n497" "VOUT.n496" 163.366 -resist "VOUT.n501" "VOUT.n500" 163.366 -resist "VOUT.n505" "VOUT.n504" 163.366 -resist "VOUT.n509" "VOUT.n402" 163.366 -resist "VOUT.n401" "VOUT.n384" 163.366 -resist "VOUT.t5" "VOUT.n73" 167.116 -resist "VOUT.t4" "VOUT.n80" 167.116 -resist "VOUT.n315" "VOUT.t9" 175.381 -resist "VOUT.n317" "VOUT.t23" 175.381 -resist "VOUT.n407" "VOUT.t19" 175.381 -resist "VOUT.n405" "VOUT.t16" 175.381 -resist "VOUT.n75" "VOUT.n74" 185 -resist "VOUT.n82" "VOUT.n81" 185 -resist "VOUT.n31" "VOUT.t31" 207.962 -resist "VOUT.n33" "VOUT.t10" 207.962 -resist "VOUT.n159" "VOUT.t28" 207.962 -resist "VOUT.n167" "VOUT.t24" 207.962 -resist "VOUT.n315" "VOUT.t6" 228.009 -resist "VOUT.n317" "VOUT.t21" 228.009 -resist "VOUT.n407" "VOUT.t18" 228.009 -resist "VOUT.n405" "VOUT.t14" 228.009 -resist "VOUT.n32" "VOUT.t33" 233.891 -resist "VOUT.n34" "VOUT.t13" 233.891 -resist "VOUT.n160" "VOUT.t29" 233.891 -resist "VOUT.n168" "VOUT.t26" 233.891 -resist "VOUT.n288" "VOUT.n16" 240.244 -resist "VOUT.n288" "VOUT.n287" 240.244 -resist "VOUT.n287" "VOUT.n110" 240.244 -resist "VOUT.n283" "VOUT.n110" 240.244 -resist "VOUT.n283" "VOUT.n113" 240.244 -resist "VOUT.n275" "VOUT.n113" 240.244 -resist "VOUT.n275" "VOUT.n118" 240.244 -resist "VOUT.n271" "VOUT.n118" 240.244 -resist "VOUT.n271" "VOUT.n120" 240.244 -resist "VOUT.n265" "VOUT.n120" 240.244 -resist "VOUT.n265" "VOUT.n124" 240.244 -resist "VOUT.n253" "VOUT.n124" 240.244 -resist "VOUT.n253" "VOUT.n134" 240.244 -resist "VOUT.n247" "VOUT.n134" 240.244 -resist "VOUT.n247" "VOUT.n246" 240.244 -resist "VOUT.n246" "VOUT.n138" 240.244 -resist "VOUT.n236" "VOUT.n138" 240.244 -resist "VOUT.n236" "VOUT.n146" 240.244 -resist "VOUT.n229" "VOUT.n146" 240.244 -resist "VOUT.n629" "VOUT.n13" 240.244 -resist "VOUT.n13" "VOUT.n10" 240.244 -resist "VOUT.n10" "VOUT.n9" 240.244 -resist "VOUT.n9" "VOUT.n8" 240.244 -resist "VOUT.n111" "VOUT.n8" 240.244 -resist "VOUT.n111" "VOUT.n5" 240.244 -resist "VOUT.n5" "VOUT.n4" 240.244 -resist "VOUT.n4" "VOUT.n3" 240.244 -resist "VOUT.n127" "VOUT.n3" 240.244 -resist "VOUT.n263" "VOUT.n127" 240.244 -resist "VOUT.n263" "VOUT.n126" 240.244 -resist "VOUT.n132" "VOUT.n126" 240.244 -resist "VOUT.n256" "VOUT.n132" 240.244 -resist "VOUT.n256" "VOUT.n131" 240.244 -resist "VOUT.n244" "VOUT.n131" 240.244 -resist "VOUT.n244" "VOUT.n140" 240.244 -resist "VOUT.n238" "VOUT.n140" 240.244 -resist "VOUT.n238" "VOUT.n144" 240.244 -resist "VOUT.n227" "VOUT.n144" 240.244 -resist "VOUT.n443" "VOUT.n385" 240.244 -resist "VOUT.n443" "VOUT.n377" 240.244 -resist "VOUT.n377" "VOUT.n376" 240.244 -resist "VOUT.n376" "VOUT.n375" 240.244 -resist "VOUT.n436" "VOUT.n375" 240.244 -resist "VOUT.n436" "VOUT.n366" 240.244 -resist "VOUT.n366" "VOUT.n365" 240.244 -resist "VOUT.n365" "VOUT.n364" 240.244 -resist "VOUT.n429" "VOUT.n364" 240.244 -resist "VOUT.n429" "VOUT.n355" 240.244 -resist "VOUT.n355" "VOUT.n354" 240.244 -resist "VOUT.n354" "VOUT.n353" 240.244 -resist "VOUT.n422" "VOUT.n353" 240.244 -resist "VOUT.n422" "VOUT.n344" 240.244 -resist "VOUT.n344" "VOUT.n343" 240.244 -resist "VOUT.n343" "VOUT.n342" 240.244 -resist "VOUT.n342" "VOUT.n325" 240.244 -resist "VOUT.n551" "VOUT.n325" 240.244 -resist "VOUT.n551" "VOUT.n324" 240.244 -resist "VOUT.n324" "VOUT.n320" 240.244 -resist "VOUT.n558" "VOUT.n320" 240.244 -resist "VOUT.n513" "VOUT.n379" 240.244 -resist "VOUT.n517" "VOUT.n379" 240.244 -resist "VOUT.n517" "VOUT.n374" 240.244 -resist "VOUT.n521" "VOUT.n374" 240.244 -resist "VOUT.n521" "VOUT.n368" 240.244 -resist "VOUT.n525" "VOUT.n368" 240.244 -resist "VOUT.n525" "VOUT.n363" 240.244 -resist "VOUT.n529" "VOUT.n363" 240.244 -resist "VOUT.n529" "VOUT.n357" 240.244 -resist "VOUT.n533" "VOUT.n357" 240.244 -resist "VOUT.n533" "VOUT.n352" 240.244 -resist "VOUT.n537" "VOUT.n352" 240.244 -resist "VOUT.n537" "VOUT.n346" 240.244 -resist "VOUT.n541" "VOUT.n346" 240.244 -resist "VOUT.n541" "VOUT.n341" 240.244 -resist "VOUT.n545" "VOUT.n341" 240.244 -resist "VOUT.n545" "VOUT.n328" 240.244 -resist "VOUT.n549" "VOUT.n328" 240.244 -resist "VOUT.n549" "VOUT.n327" 240.244 -resist "VOUT.n333" "VOUT.n327" 240.244 -resist "VOUT.n333" "VOUT.n313" 240.244 -resist "VOUT.n90" "VOUT.t35" 249.88 -resist "VOUT.n627" "VOUT.n17" 256.663 -resist "VOUT.n627" "VOUT.n18" 256.663 -resist "VOUT.n627" "VOUT.n19" 256.663 -resist "VOUT.n627" "VOUT.n20" 256.663 -resist "VOUT.n627" "VOUT.n21" 256.663 -resist "VOUT.n627" "VOUT.n22" 256.663 -resist "VOUT.n627" "VOUT.n23" 256.663 -resist "VOUT.n627" "VOUT.n24" 256.663 -resist "VOUT.n627" "VOUT.n25" 256.663 -resist "VOUT.n627" "VOUT.n26" 256.663 -resist "VOUT.n627" "VOUT.n27" 256.663 -resist "VOUT.n627" "VOUT.n28" 256.663 -resist "VOUT.n627" "VOUT.n29" 256.663 -resist "VOUT.n627" "VOUT.n294" 256.663 -resist "VOUT.n170" "VOUT.n151" 256.663 -resist "VOUT.n175" "VOUT.n151" 256.663 -resist "VOUT.n181" "VOUT.n151" 256.663 -resist "VOUT.n183" "VOUT.n151" 256.663 -resist "VOUT.n189" "VOUT.n151" 256.663 -resist "VOUT.n191" "VOUT.n151" 256.663 -resist "VOUT.n197" "VOUT.n151" 256.663 -resist "VOUT.n199" "VOUT.n151" 256.663 -resist "VOUT.n206" "VOUT.n151" 256.663 -resist "VOUT.n208" "VOUT.n151" 256.663 -resist "VOUT.n214" "VOUT.n151" 256.663 -resist "VOUT.n154" "VOUT.n151" 256.663 -resist "VOUT.n221" "VOUT.n151" 256.663 -resist "VOUT.n511" "VOUT.n510" 256.663 -resist "VOUT.n511" "VOUT.n400" 256.663 -resist "VOUT.n511" "VOUT.n399" 256.663 -resist "VOUT.n511" "VOUT.n398" 256.663 -resist "VOUT.n511" "VOUT.n397" 256.663 -resist "VOUT.n511" "VOUT.n396" 256.663 -resist "VOUT.n511" "VOUT.n395" 256.663 -resist "VOUT.n511" "VOUT.n394" 256.663 -resist "VOUT.n511" "VOUT.n393" 256.663 -resist "VOUT.n511" "VOUT.n392" 256.663 -resist "VOUT.n511" "VOUT.n391" 256.663 -resist "VOUT.n511" "VOUT.n390" 256.663 -resist "VOUT.n511" "VOUT.n389" 256.663 -resist "VOUT.n511" "VOUT.n388" 256.663 -resist "VOUT.n511" "VOUT.n387" 256.663 -resist "VOUT.n511" "VOUT.n386" 256.663 -resist "VOUT.n626" "VOUT.n309" 256.663 -resist "VOUT.n626" "VOUT.n308" 256.663 -resist "VOUT.n626" "VOUT.n307" 256.663 -resist "VOUT.n626" "VOUT.n306" 256.663 -resist "VOUT.n626" "VOUT.n305" 256.663 -resist "VOUT.n626" "VOUT.n304" 256.663 -resist "VOUT.n626" "VOUT.n303" 256.663 -resist "VOUT.n626" "VOUT.n302" 256.663 -resist "VOUT.n626" "VOUT.n301" 256.663 -resist "VOUT.n626" "VOUT.n300" 256.663 -resist "VOUT.n626" "VOUT.n299" 256.663 -resist "VOUT.n626" "VOUT.n298" 256.663 -resist "VOUT.n626" "VOUT.n297" 256.663 -resist "VOUT.n626" "VOUT.n296" 256.663 -resist "VOUT.n626" "VOUT.n295" 256.663 -resist "VOUT.n626" "VOUT.n625" 256.663 -resist "VOUT.n89" "VOUT.t2" 264.649 -resist "VOUT.n31" "VOUT.t32" 278.497 -resist "VOUT.n33" "VOUT.t12" 278.497 -resist "VOUT.n159" "VOUT.t30" 278.497 -resist "VOUT.n167" "VOUT.t27" 278.497 -resist "VOUT.n628" "VOUT.n627" 284.497 -resist "VOUT.n228" "VOUT.n151" 284.497 -resist "VOUT.n74" "VOUT.n72" 289.615 -resist "VOUT.n81" "VOUT.n79" 289.615 -resist "VOUT.n627" "VOUT.n626" 300.661 -resist "VOUT.n88" "VOUT.t34" 302.261 -resist "VOUT.n88" "VOUT.t1" 304.466 -resist "VOUT.n512" "VOUT.n511" 316.826 -resist "VOUT.n626" "VOUT.n310" 316.826 -resist "VOUT.n14" "VOUT.n12" 585 -resist "VOUT.n37" "VOUT.n36" 585 -resist "VOUT.n39" "VOUT.n38" 585 -resist "VOUT.n41" "VOUT.n40" 585 -resist "VOUT.n43" "VOUT.n42" 585 -resist "VOUT.n45" "VOUT.n44" 585 -resist "VOUT.n47" "VOUT.n46" 585 -resist "VOUT.n49" "VOUT.n48" 585 -resist "VOUT.n51" "VOUT.n50" 585 -resist "VOUT.n53" "VOUT.n52" 585 -resist "VOUT.n55" "VOUT.n54" 585 -resist "VOUT.n57" "VOUT.n56" 585 -resist "VOUT.n59" "VOUT.n58" 585 -resist "VOUT.n61" "VOUT.n60" 585 -resist "VOUT.n63" "VOUT.n62" 585 -resist "VOUT.n65" "VOUT.n64" 585 -resist "VOUT.n67" "VOUT.n66" 585 -resist "VOUT.n69" "VOUT.n68" 585 -resist "VOUT.n71" "VOUT.n70" 585 -resist "VOUT.n93" "VOUT.n92" 585 -resist "VOUT.n95" "VOUT.n94" 585 -resist "VOUT.n97" "VOUT.n96" 585 -resist "VOUT.n99" "VOUT.n98" 585 -resist "VOUT.n101" "VOUT.n100" 585 -resist "VOUT.n103" "VOUT.n102" 585 -resist "VOUT.n106" "VOUT.n105" 585 -resist "VOUT.n107" "VOUT.n30" 585 -resist "VOUT.n293" "VOUT.n292" 585 -resist "VOUT.n151" "VOUT.n150" 585 -resist "VOUT.n150" "VOUT.n149" 585 -resist "VOUT.n172" "VOUT.n171" 585 -resist "VOUT.n174" "VOUT.n173" 585 -resist "VOUT.n177" "VOUT.n176" 585 -resist "VOUT.n178" "VOUT.n166" 585 -resist "VOUT.n180" "VOUT.n179" 585 -resist "VOUT.n182" "VOUT.n165" 585 -resist "VOUT.n185" "VOUT.n184" 585 -resist "VOUT.n186" "VOUT.n164" 585 -resist "VOUT.n188" "VOUT.n187" 585 -resist "VOUT.n190" "VOUT.n163" 585 -resist "VOUT.n193" "VOUT.n192" 585 -resist "VOUT.n194" "VOUT.n162" 585 -resist "VOUT.n196" "VOUT.n195" 585 -resist "VOUT.n198" "VOUT.n161" 585 -resist "VOUT.n201" "VOUT.n200" 585 -resist "VOUT.n203" "VOUT.n158" 585 -resist "VOUT.n205" "VOUT.n204" 585 -resist "VOUT.n207" "VOUT.n157" 585 -resist "VOUT.n210" "VOUT.n209" 585 -resist "VOUT.n211" "VOUT.n156" 585 -resist "VOUT.n213" "VOUT.n212" 585 -resist "VOUT.n215" "VOUT.n155" 585 -resist "VOUT.n217" "VOUT.n216" 585 -resist "VOUT.n219" "VOUT.n218" 585 -resist "VOUT.n220" "VOUT.n151" 585 -resist "VOUT.n220" "VOUT.n153" 585 -resist "VOUT.n223" "VOUT.n222" 585 -resist "VOUT.n224" "VOUT.n152" 585 -resist "VOUT.n229" "VOUT.n228" 585 -resist "VOUT.n230" "VOUT.n229" 585 -resist "VOUT.n146" "VOUT.n145" 585 -resist "VOUT.n147" "VOUT.n146" 585 -resist "VOUT.n237" "VOUT.n236" 585 -resist "VOUT.n236" "VOUT.n235" 585 -resist "VOUT.n139" "VOUT.n138" 585 -resist "VOUT.n148" "VOUT.n138" 585 -resist "VOUT.n246" "VOUT.n245" 585 -resist "VOUT.n246" "VOUT.n137" 585 -resist "VOUT.n247" "VOUT.n133" 585 -resist "VOUT.n248" "VOUT.n247" 585 -resist "VOUT.n255" "VOUT.n134" 585 -resist "VOUT.n135" "VOUT.n134" 585 -resist "VOUT.n254" "VOUT.n253" 585 -resist "VOUT.n253" "VOUT.n252" 585 -resist "VOUT.n125" "VOUT.n124" 585 -resist "VOUT.n124" "VOUT.n123" 585 -resist "VOUT.n265" "VOUT.n264" 585 -resist "VOUT.n266" "VOUT.n265" 585 -resist "VOUT.n120" "VOUT.n119" 585 -resist "VOUT.n121" "VOUT.n120" 585 -resist "VOUT.n272" "VOUT.n271" 585 -resist "VOUT.n271" "VOUT.n270" 585 -resist "VOUT.n273" "VOUT.n118" 585 -resist "VOUT.n118" "VOUT.n117" 585 -resist "VOUT.n275" "VOUT.n274" 585 -resist "VOUT.n276" "VOUT.n275" 585 -resist "VOUT.n113" "VOUT.n112" 585 -resist "VOUT.n114" "VOUT.n113" 585 -resist "VOUT.n284" "VOUT.n283" 585 -resist "VOUT.n283" "VOUT.n282" 585 -resist "VOUT.n285" "VOUT.n110" 585 -resist "VOUT.n115" "VOUT.n110" 585 -resist "VOUT.n287" "VOUT.n286" 585 -resist "VOUT.n287" "VOUT.n109" 585 -resist "VOUT.n288" "VOUT.n15" 585 -resist "VOUT.n289" "VOUT.n288" 585 -resist "VOUT.n628" "VOUT.n16" 585 -resist "VOUT.n290" "VOUT.n16" 585 -resist "VOUT.n228" "VOUT.n227" 585 -resist "VOUT.n227" "VOUT.n226" 585 -resist "VOUT.n145" "VOUT.n144" 585 -resist "VOUT.n144" "VOUT.n143" 585 -resist "VOUT.n238" "VOUT.n237" 585 -resist "VOUT.n239" "VOUT.n238" 585 -resist "VOUT.n140" "VOUT.n139" 585 -resist "VOUT.n141" "VOUT.n140" 585 -resist "VOUT.n245" "VOUT.n244" 585 -resist "VOUT.n244" "VOUT.n243" 585 -resist "VOUT.n133" "VOUT.n131" 585 -resist "VOUT.n131" "VOUT.n130" 585 -resist "VOUT.n256" "VOUT.n255" 585 -resist "VOUT.n257" "VOUT.n256" 585 -resist "VOUT.n254" "VOUT.n132" 585 -resist "VOUT.n132" "VOUT.n128" 585 -resist "VOUT.n126" "VOUT.n125" 585 -resist "VOUT.n261" "VOUT.n126" 585 -resist "VOUT.n264" "VOUT.n263" 585 -resist "VOUT.n263" "VOUT.n262" 585 -resist "VOUT.n127" "VOUT.n119" 585 -resist "VOUT.n127" "VOUT.n1" 585 -resist "VOUT.n272" "VOUT.n3" 585 -resist "VOUT.n642" "VOUT.n3" 585 -resist "VOUT.n273" "VOUT.n4" 585 -resist "VOUT.n641" "VOUT.n4" 585 -resist "VOUT.n274" "VOUT.n5" 585 -resist "VOUT.n640" "VOUT.n5" 585 -resist "VOUT.n112" "VOUT.n111" 585 -resist "VOUT.n111" "VOUT.n6" 585 -resist "VOUT.n284" "VOUT.n8" 585 -resist "VOUT.n636" "VOUT.n8" 585 -resist "VOUT.n285" "VOUT.n9" 585 -resist "VOUT.n635" "VOUT.n9" 585 -resist "VOUT.n286" "VOUT.n10" 585 -resist "VOUT.n634" "VOUT.n10" 585 -resist "VOUT.n15" "VOUT.n13" 585 -resist "VOUT.n13" "VOUT.n11" 585 -resist "VOUT.n629" "VOUT.n628" 585 -resist "VOUT.n630" "VOUT.n629" 585 -resist "VOUT.n513" "VOUT.n512" 585 -resist "VOUT.n514" "VOUT.n513" 585 -resist "VOUT.n379" "VOUT.n378" 585 -resist "VOUT.n515" "VOUT.n379" 585 -resist "VOUT.n518" "VOUT.n517" 585 -resist "VOUT.n517" "VOUT.n516" 585 -resist "VOUT.n519" "VOUT.n374" 585 -resist "VOUT.n374" "VOUT.n373" 585 -resist "VOUT.n521" "VOUT.n520" 585 -resist "VOUT.n522" "VOUT.n521" 585 -resist "VOUT.n368" "VOUT.n367" 585 -resist "VOUT.n523" "VOUT.n368" 585 -resist "VOUT.n526" "VOUT.n525" 585 -resist "VOUT.n525" "VOUT.n524" 585 -resist "VOUT.n527" "VOUT.n363" 585 -resist "VOUT.n363" "VOUT.n362" 585 -resist "VOUT.n529" "VOUT.n528" 585 -resist "VOUT.n530" "VOUT.n529" 585 -resist "VOUT.n357" "VOUT.n356" 585 -resist "VOUT.n531" "VOUT.n357" 585 -resist "VOUT.n534" "VOUT.n533" 585 -resist "VOUT.n533" "VOUT.n532" 585 -resist "VOUT.n535" "VOUT.n352" 585 -resist "VOUT.n352" "VOUT.n351" 585 -resist "VOUT.n537" "VOUT.n536" 585 -resist "VOUT.n538" "VOUT.n537" 585 -resist "VOUT.n346" "VOUT.n345" 585 -resist "VOUT.n539" "VOUT.n346" 585 -resist "VOUT.n542" "VOUT.n541" 585 -resist "VOUT.n541" "VOUT.n540" 585 -resist "VOUT.n543" "VOUT.n341" 585 -resist "VOUT.n341" "VOUT.n340" 585 -resist "VOUT.n545" "VOUT.n544" 585 -resist "VOUT.n546" "VOUT.n545" 585 -resist "VOUT.n328" "VOUT.n326" 585 -resist "VOUT.n547" "VOUT.n328" 585 -resist "VOUT.n550" "VOUT.n549" 585 -resist "VOUT.n549" "VOUT.n548" 585 -resist "VOUT.n331" "VOUT.n327" 585 -resist "VOUT.n329" "VOUT.n327" 585 -resist "VOUT.n333" "VOUT.n332" 585 -resist "VOUT.n334" "VOUT.n333" 585 -resist "VOUT.n313" "VOUT.n310" 585 -resist "VOUT.n330" "VOUT.n313" 585 -resist "VOUT.n558" "VOUT.n310" 585 -resist "VOUT.n558" "VOUT.n557" 585 -resist "VOUT.n332" "VOUT.n320" 585 -resist "VOUT.n556" "VOUT.n320" 585 -resist "VOUT.n331" "VOUT.n324" 585 -resist "VOUT.n324" "VOUT.n321" 585 -resist "VOUT.n551" "VOUT.n550" 585 -resist "VOUT.n552" "VOUT.n551" 585 -resist "VOUT.n326" "VOUT.n325" 585 -resist "VOUT.n325" "VOUT.n323" 585 -resist "VOUT.n544" "VOUT.n342" 585 -resist "VOUT.n417" "VOUT.n342" 585 -resist "VOUT.n543" "VOUT.n343" 585 -resist "VOUT.n416" "VOUT.n343" 585 -resist "VOUT.n542" "VOUT.n344" 585 -resist "VOUT.n421" "VOUT.n344" 585 -resist "VOUT.n422" "VOUT.n345" 585 -resist "VOUT.n423" "VOUT.n422" 585 -resist "VOUT.n536" "VOUT.n353" 585 -resist "VOUT.n424" "VOUT.n353" 585 -resist "VOUT.n535" "VOUT.n354" 585 -resist "VOUT.n414" "VOUT.n354" 585 -resist "VOUT.n534" "VOUT.n355" 585 -resist "VOUT.n428" "VOUT.n355" 585 -resist "VOUT.n429" "VOUT.n356" 585 -resist "VOUT.n430" "VOUT.n429" 585 -resist "VOUT.n528" "VOUT.n364" 585 -resist "VOUT.n431" "VOUT.n364" 585 -resist "VOUT.n527" "VOUT.n365" 585 -resist "VOUT.n412" "VOUT.n365" 585 -resist "VOUT.n526" "VOUT.n366" 585 -resist "VOUT.n435" "VOUT.n366" 585 -resist "VOUT.n436" "VOUT.n367" 585 -resist "VOUT.n437" "VOUT.n436" 585 -resist "VOUT.n520" "VOUT.n375" 585 -resist "VOUT.n438" "VOUT.n375" 585 -resist "VOUT.n519" "VOUT.n376" 585 -resist "VOUT.n410" "VOUT.n376" 585 -resist "VOUT.n518" "VOUT.n377" 585 -resist "VOUT.n442" "VOUT.n377" 585 -resist "VOUT.n443" "VOUT.n378" 585 -resist "VOUT.n444" "VOUT.n443" 585 -resist "VOUT.n512" "VOUT.n385" 585 -resist "VOUT.n445" "VOUT.n385" 585 -resist "VOUT.n511" "VOUT.n384" 585 -resist "VOUT.n403" "VOUT.n384" 585 -resist "VOUT.n404" "VOUT.n401" 585 -resist "VOUT.n509" "VOUT.n508" 585 -resist "VOUT.n507" "VOUT.n402" 585 -resist "VOUT.n506" "VOUT.n505" 585 -resist "VOUT.n504" "VOUT.n503" 585 -resist "VOUT.n502" "VOUT.n501" 585 -resist "VOUT.n500" "VOUT.n499" 585 -resist "VOUT.n498" "VOUT.n497" 585 -resist "VOUT.n496" "VOUT.n495" 585 -resist "VOUT.n494" "VOUT.n493" 585 -resist "VOUT.n492" "VOUT.n491" 585 -resist "VOUT.n490" "VOUT.n489" 585 -resist "VOUT.n488" "VOUT.n487" 585 -resist "VOUT.n485" "VOUT.n484" 585 -resist "VOUT.n483" "VOUT.n482" 585 -resist "VOUT.n481" "VOUT.n480" 585 -resist "VOUT.n479" "VOUT.n478" 585 -resist "VOUT.n477" "VOUT.n476" 585 -resist "VOUT.n475" "VOUT.n474" 585 -resist "VOUT.n473" "VOUT.n472" 585 -resist "VOUT.n471" "VOUT.n470" 585 -resist "VOUT.n469" "VOUT.n468" 585 -resist "VOUT.n467" "VOUT.n466" 585 -resist "VOUT.n465" "VOUT.n464" 585 -resist "VOUT.n463" "VOUT.n462" 585 -resist "VOUT.n461" "VOUT.n460" 585 -resist "VOUT.n459" "VOUT.n458" 585 -resist "VOUT.n457" "VOUT.n456" 585 -resist "VOUT.n455" "VOUT.n454" 585 -resist "VOUT.n452" "VOUT.n451" 585 -resist "VOUT.n450" "VOUT.n449" 585 -resist "VOUT.n448" "VOUT.n447" 585 -resist "VOUT.n560" "VOUT.n559" 585 -resist "VOUT.n562" "VOUT.n561" 585 -resist "VOUT.n564" "VOUT.n563" 585 -resist "VOUT.n567" "VOUT.n566" 585 -resist "VOUT.n569" "VOUT.n568" 585 -resist "VOUT.n571" "VOUT.n570" 585 -resist "VOUT.n573" "VOUT.n572" 585 -resist "VOUT.n575" "VOUT.n574" 585 -resist "VOUT.n577" "VOUT.n576" 585 -resist "VOUT.n579" "VOUT.n578" 585 -resist "VOUT.n581" "VOUT.n580" 585 -resist "VOUT.n583" "VOUT.n582" 585 -resist "VOUT.n585" "VOUT.n584" 585 -resist "VOUT.n587" "VOUT.n586" 585 -resist "VOUT.n589" "VOUT.n588" 585 -resist "VOUT.n591" "VOUT.n590" 585 -resist "VOUT.n593" "VOUT.n592" 585 -resist "VOUT.n595" "VOUT.n594" 585 -resist "VOUT.n597" "VOUT.n596" 585 -resist "VOUT.n600" "VOUT.n599" 585 -resist "VOUT.n602" "VOUT.n601" 585 -resist "VOUT.n604" "VOUT.n603" 585 -resist "VOUT.n606" "VOUT.n605" 585 -resist "VOUT.n608" "VOUT.n607" 585 -resist "VOUT.n610" "VOUT.n609" 585 -resist "VOUT.n612" "VOUT.n611" 585 -resist "VOUT.n614" "VOUT.n613" 585 -resist "VOUT.n616" "VOUT.n615" 585 -resist "VOUT.n618" "VOUT.n617" 585 -resist "VOUT.n620" "VOUT.n619" 585 -resist "VOUT.n626" "VOUT.n311" 585 -resist "VOUT.n621" "VOUT.n311" 585 -resist "VOUT.n622" "VOUT.n312" 585 -resist "VOUT.n624" "VOUT.n623" 585 -resist "VOUT.n293" "VOUT.n16" 591 -resist "VOUT.n629" "VOUT.n14" 591 -resist "VOUT.n229" "VOUT.n150" 591 -resist "VOUT.n227" "VOUT.n152" 591 -resist "VOUT.n559" "VOUT.n558" 711.122 -resist "VOUT.n447" "VOUT.n385" 711.122 -resist "VOUT.n513" "VOUT.n384" 711.122 -resist "VOUT.n624" "VOUT.n313" 711.122 -device msubckt sky130_fd_pr__nfet_01v8 521 248 522 249 "VOUT.t7" "VOUT.t6" 948 0 "VOUT.t8" 400 0 "VOUT.t9" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 2361 -664 2362 -663 "VOUT.t0" "Ib.t3" 788 0 "VOUT.t34" 200 0 "VOUT.t35" 200 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 1683 248 1684 249 "VOUT.t11" "VOUT.t10" 788 0 "VOUT.t12" 200 0 "VOUT.t13" 200 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 -237 248 -236 249 "VOUT.t3" "VIN.t1" 948 0 "VOUT.t5" 400 31200,956 "Ib.t1" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -995 248 -994 249 "VOUT.t15" "VOUT.t14" 948 0 "VOUT.t16" 400 0 "VOUT.t17" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -995 -864 -994 -863 "VOUT.t15" "VOUT.t18" 948 0 "VOUT.t19" 400 0 "VOUT.t20" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 -237 -864 -236 -863 "VOUT.t3" "VIN.t0" 948 0 "VOUT.t4" 400 31200,956 "Ib.t0" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 521 -864 522 -863 "VOUT.t7" "VOUT.t21" 948 0 "VOUT.t22" 400 0 "VOUT.t23" 400 31200,956 -device msubckt sky130_fd_pr__nfet_01v8 2361 248 2362 249 "VOUT.t0" "Ib.t2" 788 0 "VOUT.t1" 200 0 "VOUT.t2" 200 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 3039 -664 3040 -663 "VOUT.t25" "VOUT.t24" 788 0 "VOUT.t26" 200 0 "VOUT.t27" 200 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 3039 248 3040 249 "VOUT.t25" "VOUT.t28" 788 0 "VOUT.t29" 200 0 "VOUT.t30" 200 15600,556 -device msubckt sky130_fd_pr__nfet_01v8 1683 -664 1684 -663 "VOUT.t11" "VOUT.t31" 788 0 "VOUT.t32" 200 0 "VOUT.t33" 200 15600,556 diff --git a/src/glayout/blocks/elementary/FVF/fvf.sim b/src/glayout/blocks/elementary/FVF/fvf.sim deleted file mode 100644 index 3d936658..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf.sim +++ /dev/null @@ -1,19 +0,0 @@ -| units: 500000 tech: sky130A format: MIT -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=-663 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=248 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=3039 y=-663 sky130_fd_pr__nfet_01v8 -x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=248 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=-863 sky130_fd_pr__nfet_01v8 -x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=-863 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=-863 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=-994 y=248 sky130_fd_pr__nfet_01v8 -x VIN VOUT Ib VOUT s=31200,956 d=31200,956 l=474 w=400 x=-236 y=248 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=15600,556 l=394 w=200 x=1683 y=248 sky130_fd_pr__nfet_01v8 -x Ib VOUT VOUT VOUT d=15600,556 l=394 w=200 x=2361 y=-663 sky130_fd_pr__nfet_01v8 -x VOUT VOUT VOUT VOUT d=31200,956 l=474 w=400 x=521 y=248 sky130_fd_pr__nfet_01v8 -C Ib0 11.7 -R Ib 2390 -C VIN0 3.9 -R VIN 679 -R VOUT 67459 -= VOUT VBULK diff --git a/src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt b/src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt deleted file mode 100644 index f437979a..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf_drc_out/drc/fvf/fvf.rpt +++ /dev/null @@ -1,21 +0,0 @@ -fvf count: ----------------------------------------- -Metal2 spacing < 0.14um (met2.2) ----------------------------------------- - 10.245um -0.895um 10.300um -0.755um - 10.245um -0.895um 10.300um -0.720um - 10.245um -0.720um 10.300um -0.460um - 10.245um -0.460um 10.300um 0.000um - 10.105um -0.460um 10.160um 0.000um - 10.105um -0.720um 10.125um -0.460um - 10.125um -0.720um 10.160um -0.460um - 10.105um -0.755um 10.160um -0.720um - 10.245um 0.000um 10.300um 1.975um - 10.105um 0.000um 10.160um 1.975um ----------------------------------------- -Via1 width < 0.26um (via.1a + 2 * via.4a) ----------------------------------------- - 14.460um -4.050um 14.645um -4.005um - 14.460um -4.055um 14.645um -4.050um ----------------------------------------- - diff --git a/src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt b/src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt deleted file mode 100644 index 0c537f19..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf_lvs_out/lvs/fvf/fvf_lvs.rpt +++ /dev/null @@ -1,58 +0,0 @@ - -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 NMOS in circuit fvf (1)(2 instances) -Flattening unmatched subcell NMOS_1 in circuit fvf (1)(2 instances) - -Cell fvf (0) disconnected node: VBULK -Class fvf (0): Merged 9 parallel devices. -Class fvf (1): Merged 9 parallel devices. -Cell fvf (0) disconnected node: VBULK -Subcircuit summary: -Circuit 1: fvf |Circuit 2: fvf --------------------------------------------|------------------------------------------- -sky130_fd_pr__nfet_01v8 (12->3) |sky130_fd_pr__nfet_01v8 (24->3) -Number of devices: 3 |Number of devices: 3 -Number of nets: 3 **Mismatch** |Number of nets: 4 **Mismatch** ---------------------------------------------------------------------------------------- -NET mismatches: Class fragments follow (with fanout counts): -Circuit 1: fvf |Circuit 2: fvf - ---------------------------------------------------------------------------------------- -Net: VOUT |Net: VOUT - sky130_fd_pr__nfet_01v8/(1|3) = 5 | sky130_fd_pr__nfet_01v8/(1|3) = 2 - sky130_fd_pr__nfet_01v8/2 = 1 | - sky130_fd_pr__nfet_01v8/4 = 3 | - | -(no matching net) |Net: VBULK - | sky130_fd_pr__nfet_01v8/4 = 3 - | sky130_fd_pr__nfet_01v8/(1|3) = 3 - | sky130_fd_pr__nfet_01v8/2 = 1 ---------------------------------------------------------------------------------------- -Netlists do not match. - -Subcircuit pins: -Circuit 1: fvf |Circuit 2: fvf --------------------------------------------|------------------------------------------- -VOUT |VOUT -Ib |Ib -VIN |VIN -(no matching pin) |VBULK -VBULK |(no matching pin) ---------------------------------------------------------------------------------------- -Cell pin lists for fvf and fvf altered to match. -Device classes fvf and fvf are equivalent. - -Final result: Top level cell failed pin matching. diff --git a/src/glayout/blocks/elementary/FVF/fvf_pex.spice b/src/glayout/blocks/elementary/FVF/fvf_pex.spice deleted file mode 100644 index 4ba5c6cc..00000000 --- a/src/glayout/blocks/elementary/FVF/fvf_pex.spice +++ /dev/null @@ -1,1173 +0,0 @@ -* NGSPICE file created from fvf.ext - technology: sky130A - -.subckt fvf VBULK VIN VOUT Ib -X0 VOUT.t33 VOUT.t31 VOUT.t32 VOUT.t11 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 -X1 VOUT.t30 VOUT.t28 VOUT.t29 VOUT.t25 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 -X2 VOUT.t27 VOUT.t24 VOUT.t26 VOUT.t25 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 -X3 VOUT.t2 Ib.t2 VOUT.t1 VOUT.t0 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 -X4 VOUT.t23 VOUT.t21 VOUT.t22 VOUT.t7 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 -X5 Ib.t0 VIN.t0 VOUT.t4 VOUT.t3 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0.78 ps=4.78 w=2 l=2.37 -X6 VOUT.t20 VOUT.t18 VOUT.t19 VOUT.t15 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 -X7 VOUT.t17 VOUT.t14 VOUT.t16 VOUT.t15 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 -X8 Ib.t1 VIN.t1 VOUT.t5 VOUT.t3 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0.78 ps=4.78 w=2 l=2.37 -X9 VOUT.t13 VOUT.t10 VOUT.t12 VOUT.t11 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 -X10 VOUT.t35 Ib.t3 VOUT.t34 VOUT.t0 sky130_fd_pr__nfet_01v8 ad=0.39 pd=2.78 as=0 ps=0 w=1 l=1.97 -X11 VOUT.t9 VOUT.t6 VOUT.t8 VOUT.t7 sky130_fd_pr__nfet_01v8 ad=0.78 pd=4.78 as=0 ps=0 w=2 l=2.37 -R0 VOUT.n624 VOUT.n313 711.122 -R1 VOUT.n513 VOUT.n384 711.122 -R2 VOUT.n447 VOUT.n385 711.122 -R3 VOUT.n559 VOUT.n558 711.122 -R4 VOUT.n227 VOUT.n152 591 -R5 VOUT.n229 VOUT.n150 591 -R6 VOUT.n629 VOUT.n14 591 -R7 VOUT.n293 VOUT.n16 591 -R8 VOUT.n624 VOUT.n623 585 -R9 VOUT.n622 VOUT.n312 585 -R10 VOUT.n621 VOUT.n311 585 -R11 VOUT.n626 VOUT.n311 585 -R12 VOUT.n620 VOUT.n619 585 -R13 VOUT.n618 VOUT.n617 585 -R14 VOUT.n616 VOUT.n615 585 -R15 VOUT.n614 VOUT.n613 585 -R16 VOUT.n612 VOUT.n611 585 -R17 VOUT.n610 VOUT.n609 585 -R18 VOUT.n608 VOUT.n607 585 -R19 VOUT.n606 VOUT.n605 585 -R20 VOUT.n604 VOUT.n603 585 -R21 VOUT.n602 VOUT.n601 585 -R22 VOUT.n600 VOUT.n599 585 -R23 VOUT.n597 VOUT.n596 585 -R24 VOUT.n595 VOUT.n594 585 -R25 VOUT.n593 VOUT.n592 585 -R26 VOUT.n591 VOUT.n590 585 -R27 VOUT.n589 VOUT.n588 585 -R28 VOUT.n587 VOUT.n586 585 -R29 VOUT.n585 VOUT.n584 585 -R30 VOUT.n583 VOUT.n582 585 -R31 VOUT.n581 VOUT.n580 585 -R32 VOUT.n579 VOUT.n578 585 -R33 VOUT.n577 VOUT.n576 585 -R34 VOUT.n575 VOUT.n574 585 -R35 VOUT.n573 VOUT.n572 585 -R36 VOUT.n571 VOUT.n570 585 -R37 VOUT.n569 VOUT.n568 585 -R38 VOUT.n567 VOUT.n566 585 -R39 VOUT.n564 VOUT.n563 585 -R40 VOUT.n562 VOUT.n561 585 -R41 VOUT.n560 VOUT.n559 585 -R42 VOUT.n448 VOUT.n447 585 -R43 VOUT.n450 VOUT.n449 585 -R44 VOUT.n452 VOUT.n451 585 -R45 VOUT.n455 VOUT.n454 585 -R46 VOUT.n457 VOUT.n456 585 -R47 VOUT.n459 VOUT.n458 585 -R48 VOUT.n461 VOUT.n460 585 -R49 VOUT.n463 VOUT.n462 585 -R50 VOUT.n465 VOUT.n464 585 -R51 VOUT.n467 VOUT.n466 585 -R52 VOUT.n469 VOUT.n468 585 -R53 VOUT.n471 VOUT.n470 585 -R54 VOUT.n473 VOUT.n472 585 -R55 VOUT.n475 VOUT.n474 585 -R56 VOUT.n477 VOUT.n476 585 -R57 VOUT.n479 VOUT.n478 585 -R58 VOUT.n481 VOUT.n480 585 -R59 VOUT.n483 VOUT.n482 585 -R60 VOUT.n485 VOUT.n484 585 -R61 VOUT.n488 VOUT.n487 585 -R62 VOUT.n490 VOUT.n489 585 -R63 VOUT.n492 VOUT.n491 585 -R64 VOUT.n494 VOUT.n493 585 -R65 VOUT.n496 VOUT.n495 585 -R66 VOUT.n498 VOUT.n497 585 -R67 VOUT.n500 VOUT.n499 585 -R68 VOUT.n502 VOUT.n501 585 -R69 VOUT.n504 VOUT.n503 585 -R70 VOUT.n506 VOUT.n505 585 -R71 VOUT.n507 VOUT.n402 585 -R72 VOUT.n509 VOUT.n508 585 -R73 VOUT.n404 VOUT.n401 585 -R74 VOUT.n403 VOUT.n384 585 -R75 VOUT.n511 VOUT.n384 585 -R76 VOUT.n445 VOUT.n385 585 -R77 VOUT.n512 VOUT.n385 585 -R78 VOUT.n444 VOUT.n443 585 -R79 VOUT.n443 VOUT.n378 585 -R80 VOUT.n442 VOUT.n377 585 -R81 VOUT.n518 VOUT.n377 585 -R82 VOUT.n410 VOUT.n376 585 -R83 VOUT.n519 VOUT.n376 585 -R84 VOUT.n438 VOUT.n375 585 -R85 VOUT.n520 VOUT.n375 585 -R86 VOUT.n437 VOUT.n436 585 -R87 VOUT.n436 VOUT.n367 585 -R88 VOUT.n435 VOUT.n366 585 -R89 VOUT.n526 VOUT.n366 585 -R90 VOUT.n412 VOUT.n365 585 -R91 VOUT.n527 VOUT.n365 585 -R92 VOUT.n431 VOUT.n364 585 -R93 VOUT.n528 VOUT.n364 585 -R94 VOUT.n430 VOUT.n429 585 -R95 VOUT.n429 VOUT.n356 585 -R96 VOUT.n428 VOUT.n355 585 -R97 VOUT.n534 VOUT.n355 585 -R98 VOUT.n414 VOUT.n354 585 -R99 VOUT.n535 VOUT.n354 585 -R100 VOUT.n424 VOUT.n353 585 -R101 VOUT.n536 VOUT.n353 585 -R102 VOUT.n423 VOUT.n422 585 -R103 VOUT.n422 VOUT.n345 585 -R104 VOUT.n421 VOUT.n344 585 -R105 VOUT.n542 VOUT.n344 585 -R106 VOUT.n416 VOUT.n343 585 -R107 VOUT.n543 VOUT.n343 585 -R108 VOUT.n417 VOUT.n342 585 -R109 VOUT.n544 VOUT.n342 585 -R110 VOUT.n325 VOUT.n323 585 -R111 VOUT.n326 VOUT.n325 585 -R112 VOUT.n552 VOUT.n551 585 -R113 VOUT.n551 VOUT.n550 585 -R114 VOUT.n324 VOUT.n321 585 -R115 VOUT.n331 VOUT.n324 585 -R116 VOUT.n556 VOUT.n320 585 -R117 VOUT.n332 VOUT.n320 585 -R118 VOUT.n558 VOUT.n557 585 -R119 VOUT.n558 VOUT.n310 585 -R120 VOUT.n330 VOUT.n313 585 -R121 VOUT.n313 VOUT.n310 585 -R122 VOUT.n334 VOUT.n333 585 -R123 VOUT.n333 VOUT.n332 585 -R124 VOUT.n329 VOUT.n327 585 -R125 VOUT.n331 VOUT.n327 585 -R126 VOUT.n549 VOUT.n548 585 -R127 VOUT.n550 VOUT.n549 585 -R128 VOUT.n547 VOUT.n328 585 -R129 VOUT.n328 VOUT.n326 585 -R130 VOUT.n546 VOUT.n545 585 -R131 VOUT.n545 VOUT.n544 585 -R132 VOUT.n341 VOUT.n340 585 -R133 VOUT.n543 VOUT.n341 585 -R134 VOUT.n541 VOUT.n540 585 -R135 VOUT.n542 VOUT.n541 585 -R136 VOUT.n539 VOUT.n346 585 -R137 VOUT.n346 VOUT.n345 585 -R138 VOUT.n538 VOUT.n537 585 -R139 VOUT.n537 VOUT.n536 585 -R140 VOUT.n352 VOUT.n351 585 -R141 VOUT.n535 VOUT.n352 585 -R142 VOUT.n533 VOUT.n532 585 -R143 VOUT.n534 VOUT.n533 585 -R144 VOUT.n531 VOUT.n357 585 -R145 VOUT.n357 VOUT.n356 585 -R146 VOUT.n530 VOUT.n529 585 -R147 VOUT.n529 VOUT.n528 585 -R148 VOUT.n363 VOUT.n362 585 -R149 VOUT.n527 VOUT.n363 585 -R150 VOUT.n525 VOUT.n524 585 -R151 VOUT.n526 VOUT.n525 585 -R152 VOUT.n523 VOUT.n368 585 -R153 VOUT.n368 VOUT.n367 585 -R154 VOUT.n522 VOUT.n521 585 -R155 VOUT.n521 VOUT.n520 585 -R156 VOUT.n374 VOUT.n373 585 -R157 VOUT.n519 VOUT.n374 585 -R158 VOUT.n517 VOUT.n516 585 -R159 VOUT.n518 VOUT.n517 585 -R160 VOUT.n515 VOUT.n379 585 -R161 VOUT.n379 VOUT.n378 585 -R162 VOUT.n514 VOUT.n513 585 -R163 VOUT.n513 VOUT.n512 585 -R164 VOUT.n630 VOUT.n629 585 -R165 VOUT.n629 VOUT.n628 585 -R166 VOUT.n13 VOUT.n11 585 -R167 VOUT.n15 VOUT.n13 585 -R168 VOUT.n634 VOUT.n10 585 -R169 VOUT.n286 VOUT.n10 585 -R170 VOUT.n635 VOUT.n9 585 -R171 VOUT.n285 VOUT.n9 585 -R172 VOUT.n636 VOUT.n8 585 -R173 VOUT.n284 VOUT.n8 585 -R174 VOUT.n111 VOUT.n6 585 -R175 VOUT.n112 VOUT.n111 585 -R176 VOUT.n640 VOUT.n5 585 -R177 VOUT.n274 VOUT.n5 585 -R178 VOUT.n641 VOUT.n4 585 -R179 VOUT.n273 VOUT.n4 585 -R180 VOUT.n642 VOUT.n3 585 -R181 VOUT.n272 VOUT.n3 585 -R182 VOUT.n127 VOUT.n1 585 -R183 VOUT.n127 VOUT.n119 585 -R184 VOUT.n263 VOUT.n262 585 -R185 VOUT.n264 VOUT.n263 585 -R186 VOUT.n261 VOUT.n126 585 -R187 VOUT.n126 VOUT.n125 585 -R188 VOUT.n132 VOUT.n128 585 -R189 VOUT.n254 VOUT.n132 585 -R190 VOUT.n257 VOUT.n256 585 -R191 VOUT.n256 VOUT.n255 585 -R192 VOUT.n131 VOUT.n130 585 -R193 VOUT.n133 VOUT.n131 585 -R194 VOUT.n244 VOUT.n243 585 -R195 VOUT.n245 VOUT.n244 585 -R196 VOUT.n141 VOUT.n140 585 -R197 VOUT.n140 VOUT.n139 585 -R198 VOUT.n239 VOUT.n238 585 -R199 VOUT.n238 VOUT.n237 585 -R200 VOUT.n144 VOUT.n143 585 -R201 VOUT.n145 VOUT.n144 585 -R202 VOUT.n227 VOUT.n226 585 -R203 VOUT.n228 VOUT.n227 585 -R204 VOUT.n290 VOUT.n16 585 -R205 VOUT.n628 VOUT.n16 585 -R206 VOUT.n289 VOUT.n288 585 -R207 VOUT.n288 VOUT.n15 585 -R208 VOUT.n287 VOUT.n109 585 -R209 VOUT.n287 VOUT.n286 585 -R210 VOUT.n115 VOUT.n110 585 -R211 VOUT.n285 VOUT.n110 585 -R212 VOUT.n283 VOUT.n282 585 -R213 VOUT.n284 VOUT.n283 585 -R214 VOUT.n114 VOUT.n113 585 -R215 VOUT.n113 VOUT.n112 585 -R216 VOUT.n276 VOUT.n275 585 -R217 VOUT.n275 VOUT.n274 585 -R218 VOUT.n118 VOUT.n117 585 -R219 VOUT.n273 VOUT.n118 585 -R220 VOUT.n271 VOUT.n270 585 -R221 VOUT.n272 VOUT.n271 585 -R222 VOUT.n121 VOUT.n120 585 -R223 VOUT.n120 VOUT.n119 585 -R224 VOUT.n266 VOUT.n265 585 -R225 VOUT.n265 VOUT.n264 585 -R226 VOUT.n124 VOUT.n123 585 -R227 VOUT.n125 VOUT.n124 585 -R228 VOUT.n253 VOUT.n252 585 -R229 VOUT.n254 VOUT.n253 585 -R230 VOUT.n135 VOUT.n134 585 -R231 VOUT.n255 VOUT.n134 585 -R232 VOUT.n248 VOUT.n247 585 -R233 VOUT.n247 VOUT.n133 585 -R234 VOUT.n246 VOUT.n137 585 -R235 VOUT.n246 VOUT.n245 585 -R236 VOUT.n148 VOUT.n138 585 -R237 VOUT.n139 VOUT.n138 585 -R238 VOUT.n236 VOUT.n235 585 -R239 VOUT.n237 VOUT.n236 585 -R240 VOUT.n147 VOUT.n146 585 -R241 VOUT.n146 VOUT.n145 585 -R242 VOUT.n230 VOUT.n229 585 -R243 VOUT.n229 VOUT.n228 585 -R244 VOUT.n224 VOUT.n152 585 -R245 VOUT.n223 VOUT.n222 585 -R246 VOUT.n220 VOUT.n153 585 -R247 VOUT.n220 VOUT.n151 585 -R248 VOUT.n219 VOUT.n218 585 -R249 VOUT.n217 VOUT.n216 585 -R250 VOUT.n215 VOUT.n155 585 -R251 VOUT.n213 VOUT.n212 585 -R252 VOUT.n211 VOUT.n156 585 -R253 VOUT.n210 VOUT.n209 585 -R254 VOUT.n207 VOUT.n157 585 -R255 VOUT.n205 VOUT.n204 585 -R256 VOUT.n203 VOUT.n158 585 -R257 VOUT.n201 VOUT.n200 585 -R258 VOUT.n198 VOUT.n161 585 -R259 VOUT.n196 VOUT.n195 585 -R260 VOUT.n194 VOUT.n162 585 -R261 VOUT.n193 VOUT.n192 585 -R262 VOUT.n190 VOUT.n163 585 -R263 VOUT.n188 VOUT.n187 585 -R264 VOUT.n186 VOUT.n164 585 -R265 VOUT.n185 VOUT.n184 585 -R266 VOUT.n182 VOUT.n165 585 -R267 VOUT.n180 VOUT.n179 585 -R268 VOUT.n178 VOUT.n166 585 -R269 VOUT.n177 VOUT.n176 585 -R270 VOUT.n174 VOUT.n173 585 -R271 VOUT.n172 VOUT.n171 585 -R272 VOUT.n150 VOUT.n149 585 -R273 VOUT.n151 VOUT.n150 585 -R274 VOUT.n293 VOUT.n292 585 -R275 VOUT.n107 VOUT.n30 585 -R276 VOUT.n106 VOUT.n105 585 -R277 VOUT.n103 VOUT.n102 585 -R278 VOUT.n101 VOUT.n100 585 -R279 VOUT.n99 VOUT.n98 585 -R280 VOUT.n97 VOUT.n96 585 -R281 VOUT.n95 VOUT.n94 585 -R282 VOUT.n93 VOUT.n92 585 -R283 VOUT.n71 VOUT.n70 585 -R284 VOUT.n69 VOUT.n68 585 -R285 VOUT.n67 VOUT.n66 585 -R286 VOUT.n65 VOUT.n64 585 -R287 VOUT.n63 VOUT.n62 585 -R288 VOUT.n61 VOUT.n60 585 -R289 VOUT.n59 VOUT.n58 585 -R290 VOUT.n57 VOUT.n56 585 -R291 VOUT.n55 VOUT.n54 585 -R292 VOUT.n53 VOUT.n52 585 -R293 VOUT.n51 VOUT.n50 585 -R294 VOUT.n49 VOUT.n48 585 -R295 VOUT.n47 VOUT.n46 585 -R296 VOUT.n45 VOUT.n44 585 -R297 VOUT.n43 VOUT.n42 585 -R298 VOUT.n41 VOUT.n40 585 -R299 VOUT.n39 VOUT.n38 585 -R300 VOUT.n37 VOUT.n36 585 -R301 VOUT.n14 VOUT.n12 585 -R302 VOUT.n626 VOUT.n310 316.827 -R303 VOUT.n512 VOUT.n511 316.827 -R304 VOUT.n88 VOUT.t1 304.466 -R305 VOUT.n88 VOUT.t34 302.262 -R306 VOUT.n627 VOUT.n626 300.661 -R307 VOUT.n81 VOUT.n79 289.615 -R308 VOUT.n74 VOUT.n72 289.615 -R309 VOUT.n228 VOUT.n151 284.498 -R310 VOUT.n628 VOUT.n627 284.498 -R311 VOUT.n167 VOUT.t27 278.498 -R312 VOUT.n159 VOUT.t30 278.498 -R313 VOUT.n33 VOUT.t12 278.498 -R314 VOUT.n31 VOUT.t32 278.498 -R315 VOUT.n89 VOUT.t2 264.649 -R316 VOUT.n626 VOUT.n625 256.663 -R317 VOUT.n626 VOUT.n295 256.663 -R318 VOUT.n626 VOUT.n296 256.663 -R319 VOUT.n626 VOUT.n297 256.663 -R320 VOUT.n626 VOUT.n298 256.663 -R321 VOUT.n626 VOUT.n299 256.663 -R322 VOUT.n626 VOUT.n300 256.663 -R323 VOUT.n626 VOUT.n301 256.663 -R324 VOUT.n626 VOUT.n302 256.663 -R325 VOUT.n626 VOUT.n303 256.663 -R326 VOUT.n626 VOUT.n304 256.663 -R327 VOUT.n626 VOUT.n305 256.663 -R328 VOUT.n626 VOUT.n306 256.663 -R329 VOUT.n626 VOUT.n307 256.663 -R330 VOUT.n626 VOUT.n308 256.663 -R331 VOUT.n626 VOUT.n309 256.663 -R332 VOUT.n511 VOUT.n386 256.663 -R333 VOUT.n511 VOUT.n387 256.663 -R334 VOUT.n511 VOUT.n388 256.663 -R335 VOUT.n511 VOUT.n389 256.663 -R336 VOUT.n511 VOUT.n390 256.663 -R337 VOUT.n511 VOUT.n391 256.663 -R338 VOUT.n511 VOUT.n392 256.663 -R339 VOUT.n511 VOUT.n393 256.663 -R340 VOUT.n511 VOUT.n394 256.663 -R341 VOUT.n511 VOUT.n395 256.663 -R342 VOUT.n511 VOUT.n396 256.663 -R343 VOUT.n511 VOUT.n397 256.663 -R344 VOUT.n511 VOUT.n398 256.663 -R345 VOUT.n511 VOUT.n399 256.663 -R346 VOUT.n511 VOUT.n400 256.663 -R347 VOUT.n511 VOUT.n510 256.663 -R348 VOUT.n221 VOUT.n151 256.663 -R349 VOUT.n154 VOUT.n151 256.663 -R350 VOUT.n214 VOUT.n151 256.663 -R351 VOUT.n208 VOUT.n151 256.663 -R352 VOUT.n206 VOUT.n151 256.663 -R353 VOUT.n199 VOUT.n151 256.663 -R354 VOUT.n197 VOUT.n151 256.663 -R355 VOUT.n191 VOUT.n151 256.663 -R356 VOUT.n189 VOUT.n151 256.663 -R357 VOUT.n183 VOUT.n151 256.663 -R358 VOUT.n181 VOUT.n151 256.663 -R359 VOUT.n175 VOUT.n151 256.663 -R360 VOUT.n170 VOUT.n151 256.663 -R361 VOUT.n627 VOUT.n294 256.663 -R362 VOUT.n627 VOUT.n29 256.663 -R363 VOUT.n627 VOUT.n28 256.663 -R364 VOUT.n627 VOUT.n27 256.663 -R365 VOUT.n627 VOUT.n26 256.663 -R366 VOUT.n627 VOUT.n25 256.663 -R367 VOUT.n627 VOUT.n24 256.663 -R368 VOUT.n627 VOUT.n23 256.663 -R369 VOUT.n627 VOUT.n22 256.663 -R370 VOUT.n627 VOUT.n21 256.663 -R371 VOUT.n627 VOUT.n20 256.663 -R372 VOUT.n627 VOUT.n19 256.663 -R373 VOUT.n627 VOUT.n18 256.663 -R374 VOUT.n627 VOUT.n17 256.663 -R375 VOUT.n90 VOUT.t35 249.881 -R376 VOUT.n333 VOUT.n313 240.244 -R377 VOUT.n333 VOUT.n327 240.244 -R378 VOUT.n549 VOUT.n327 240.244 -R379 VOUT.n549 VOUT.n328 240.244 -R380 VOUT.n545 VOUT.n328 240.244 -R381 VOUT.n545 VOUT.n341 240.244 -R382 VOUT.n541 VOUT.n341 240.244 -R383 VOUT.n541 VOUT.n346 240.244 -R384 VOUT.n537 VOUT.n346 240.244 -R385 VOUT.n537 VOUT.n352 240.244 -R386 VOUT.n533 VOUT.n352 240.244 -R387 VOUT.n533 VOUT.n357 240.244 -R388 VOUT.n529 VOUT.n357 240.244 -R389 VOUT.n529 VOUT.n363 240.244 -R390 VOUT.n525 VOUT.n363 240.244 -R391 VOUT.n525 VOUT.n368 240.244 -R392 VOUT.n521 VOUT.n368 240.244 -R393 VOUT.n521 VOUT.n374 240.244 -R394 VOUT.n517 VOUT.n374 240.244 -R395 VOUT.n517 VOUT.n379 240.244 -R396 VOUT.n513 VOUT.n379 240.244 -R397 VOUT.n558 VOUT.n320 240.244 -R398 VOUT.n324 VOUT.n320 240.244 -R399 VOUT.n551 VOUT.n324 240.244 -R400 VOUT.n551 VOUT.n325 240.244 -R401 VOUT.n342 VOUT.n325 240.244 -R402 VOUT.n343 VOUT.n342 240.244 -R403 VOUT.n344 VOUT.n343 240.244 -R404 VOUT.n422 VOUT.n344 240.244 -R405 VOUT.n422 VOUT.n353 240.244 -R406 VOUT.n354 VOUT.n353 240.244 -R407 VOUT.n355 VOUT.n354 240.244 -R408 VOUT.n429 VOUT.n355 240.244 -R409 VOUT.n429 VOUT.n364 240.244 -R410 VOUT.n365 VOUT.n364 240.244 -R411 VOUT.n366 VOUT.n365 240.244 -R412 VOUT.n436 VOUT.n366 240.244 -R413 VOUT.n436 VOUT.n375 240.244 -R414 VOUT.n376 VOUT.n375 240.244 -R415 VOUT.n377 VOUT.n376 240.244 -R416 VOUT.n443 VOUT.n377 240.244 -R417 VOUT.n443 VOUT.n385 240.244 -R418 VOUT.n227 VOUT.n144 240.244 -R419 VOUT.n238 VOUT.n144 240.244 -R420 VOUT.n238 VOUT.n140 240.244 -R421 VOUT.n244 VOUT.n140 240.244 -R422 VOUT.n244 VOUT.n131 240.244 -R423 VOUT.n256 VOUT.n131 240.244 -R424 VOUT.n256 VOUT.n132 240.244 -R425 VOUT.n132 VOUT.n126 240.244 -R426 VOUT.n263 VOUT.n126 240.244 -R427 VOUT.n263 VOUT.n127 240.244 -R428 VOUT.n127 VOUT.n3 240.244 -R429 VOUT.n4 VOUT.n3 240.244 -R430 VOUT.n5 VOUT.n4 240.244 -R431 VOUT.n111 VOUT.n5 240.244 -R432 VOUT.n111 VOUT.n8 240.244 -R433 VOUT.n9 VOUT.n8 240.244 -R434 VOUT.n10 VOUT.n9 240.244 -R435 VOUT.n13 VOUT.n10 240.244 -R436 VOUT.n629 VOUT.n13 240.244 -R437 VOUT.n229 VOUT.n146 240.244 -R438 VOUT.n236 VOUT.n146 240.244 -R439 VOUT.n236 VOUT.n138 240.244 -R440 VOUT.n246 VOUT.n138 240.244 -R441 VOUT.n247 VOUT.n246 240.244 -R442 VOUT.n247 VOUT.n134 240.244 -R443 VOUT.n253 VOUT.n134 240.244 -R444 VOUT.n253 VOUT.n124 240.244 -R445 VOUT.n265 VOUT.n124 240.244 -R446 VOUT.n265 VOUT.n120 240.244 -R447 VOUT.n271 VOUT.n120 240.244 -R448 VOUT.n271 VOUT.n118 240.244 -R449 VOUT.n275 VOUT.n118 240.244 -R450 VOUT.n275 VOUT.n113 240.244 -R451 VOUT.n283 VOUT.n113 240.244 -R452 VOUT.n283 VOUT.n110 240.244 -R453 VOUT.n287 VOUT.n110 240.244 -R454 VOUT.n288 VOUT.n287 240.244 -R455 VOUT.n288 VOUT.n16 240.244 -R456 VOUT.n168 VOUT.t26 233.892 -R457 VOUT.n160 VOUT.t29 233.892 -R458 VOUT.n34 VOUT.t13 233.892 -R459 VOUT.n32 VOUT.t33 233.892 -R460 VOUT.n405 VOUT.t14 228.01 -R461 VOUT.n407 VOUT.t18 228.01 -R462 VOUT.n317 VOUT.t21 228.01 -R463 VOUT.n315 VOUT.t6 228.01 -R464 VOUT.n167 VOUT.t24 207.963 -R465 VOUT.n159 VOUT.t28 207.963 -R466 VOUT.n33 VOUT.t10 207.963 -R467 VOUT.n31 VOUT.t31 207.963 -R468 VOUT.n82 VOUT.n81 185 -R469 VOUT.n75 VOUT.n74 185 -R470 VOUT.n405 VOUT.t16 175.381 -R471 VOUT.n407 VOUT.t19 175.381 -R472 VOUT.n317 VOUT.t23 175.381 -R473 VOUT.n315 VOUT.t9 175.381 -R474 VOUT.t4 VOUT.n80 167.117 -R475 VOUT.t5 VOUT.n73 167.117 -R476 VOUT.n401 VOUT.n384 163.367 -R477 VOUT.n509 VOUT.n402 163.367 -R478 VOUT.n505 VOUT.n504 163.367 -R479 VOUT.n501 VOUT.n500 163.367 -R480 VOUT.n497 VOUT.n496 163.367 -R481 VOUT.n493 VOUT.n492 163.367 -R482 VOUT.n489 VOUT.n488 163.367 -R483 VOUT.n484 VOUT.n483 163.367 -R484 VOUT.n480 VOUT.n479 163.367 -R485 VOUT.n476 VOUT.n475 163.367 -R486 VOUT.n472 VOUT.n471 163.367 -R487 VOUT.n468 VOUT.n467 163.367 -R488 VOUT.n464 VOUT.n463 163.367 -R489 VOUT.n460 VOUT.n459 163.367 -R490 VOUT.n456 VOUT.n455 163.367 -R491 VOUT.n451 VOUT.n450 163.367 -R492 VOUT.n312 VOUT.n311 163.367 -R493 VOUT.n619 VOUT.n311 163.367 -R494 VOUT.n617 VOUT.n616 163.367 -R495 VOUT.n613 VOUT.n612 163.367 -R496 VOUT.n609 VOUT.n608 163.367 -R497 VOUT.n605 VOUT.n604 163.367 -R498 VOUT.n601 VOUT.n600 163.367 -R499 VOUT.n596 VOUT.n595 163.367 -R500 VOUT.n592 VOUT.n591 163.367 -R501 VOUT.n588 VOUT.n587 163.367 -R502 VOUT.n584 VOUT.n583 163.367 -R503 VOUT.n580 VOUT.n579 163.367 -R504 VOUT.n576 VOUT.n575 163.367 -R505 VOUT.n572 VOUT.n571 163.367 -R506 VOUT.n568 VOUT.n567 163.367 -R507 VOUT.n563 VOUT.n562 163.367 -R508 VOUT.n222 VOUT.n220 163.367 -R509 VOUT.n220 VOUT.n219 163.367 -R510 VOUT.n216 VOUT.n215 163.367 -R511 VOUT.n213 VOUT.n156 163.367 -R512 VOUT.n209 VOUT.n207 163.367 -R513 VOUT.n205 VOUT.n158 163.367 -R514 VOUT.n200 VOUT.n198 163.367 -R515 VOUT.n196 VOUT.n162 163.367 -R516 VOUT.n192 VOUT.n190 163.367 -R517 VOUT.n188 VOUT.n164 163.367 -R518 VOUT.n184 VOUT.n182 163.367 -R519 VOUT.n180 VOUT.n166 163.367 -R520 VOUT.n176 VOUT.n174 163.367 -R521 VOUT.n171 VOUT.n150 163.367 -R522 VOUT.n38 VOUT.n37 163.367 -R523 VOUT.n42 VOUT.n41 163.367 -R524 VOUT.n46 VOUT.n45 163.367 -R525 VOUT.n50 VOUT.n49 163.367 -R526 VOUT.n54 VOUT.n53 163.367 -R527 VOUT.n58 VOUT.n57 163.367 -R528 VOUT.n62 VOUT.n61 163.367 -R529 VOUT.n66 VOUT.n65 163.367 -R530 VOUT.n70 VOUT.n69 163.367 -R531 VOUT.n94 VOUT.n93 163.367 -R532 VOUT.n98 VOUT.n97 163.367 -R533 VOUT.n102 VOUT.n101 163.367 -R534 VOUT.n105 VOUT.n30 163.367 -R535 VOUT.n228 VOUT.n145 161.647 -R536 VOUT.n237 VOUT.n145 161.647 -R537 VOUT.n245 VOUT.n139 161.647 -R538 VOUT.n245 VOUT.n133 161.647 -R539 VOUT.n255 VOUT.n133 161.647 -R540 VOUT.n255 VOUT.n254 161.647 -R541 VOUT.n254 VOUT.n125 161.647 -R542 VOUT.n264 VOUT.n125 161.647 -R543 VOUT.n272 VOUT.n119 161.647 -R544 VOUT.n273 VOUT.n272 161.647 -R545 VOUT.n274 VOUT.n273 161.647 -R546 VOUT.n274 VOUT.n112 161.647 -R547 VOUT.n284 VOUT.n112 161.647 -R548 VOUT.n285 VOUT.n284 161.647 -R549 VOUT.n286 VOUT.n15 161.647 -R550 VOUT.n628 VOUT.n15 161.647 -R551 VOUT.n332 VOUT.n310 161.647 -R552 VOUT.n332 VOUT.n331 161.647 -R553 VOUT.n550 VOUT.n326 161.647 -R554 VOUT.n544 VOUT.n326 161.647 -R555 VOUT.n544 VOUT.n543 161.647 -R556 VOUT.n543 VOUT.n542 161.647 -R557 VOUT.n542 VOUT.n345 161.647 -R558 VOUT.n536 VOUT.n345 161.647 -R559 VOUT.n536 VOUT.n535 161.647 -R560 VOUT.n534 VOUT.n356 161.647 -R561 VOUT.n528 VOUT.n356 161.647 -R562 VOUT.n528 VOUT.n527 161.647 -R563 VOUT.n527 VOUT.n526 161.647 -R564 VOUT.n526 VOUT.n367 161.647 -R565 VOUT.n520 VOUT.n367 161.647 -R566 VOUT.n520 VOUT.n519 161.647 -R567 VOUT.n518 VOUT.n378 161.647 -R568 VOUT.n512 VOUT.n378 161.647 -R569 VOUT.n331 VOUT.t7 148.714 -R570 VOUT.t15 VOUT.n518 148.714 -R571 VOUT.n406 VOUT.t17 123.019 -R572 VOUT.n408 VOUT.t20 123.019 -R573 VOUT.n318 VOUT.t22 123.019 -R574 VOUT.n316 VOUT.t8 123.019 -R575 VOUT.n237 VOUT.t25 116.385 -R576 VOUT.n286 VOUT.t11 116.385 -R577 VOUT.n91 VOUT.n90 88.0899 -R578 VOUT.n264 VOUT.t0 80.8234 -R579 VOUT.t0 VOUT.n119 80.8234 -R580 VOUT.n535 VOUT.t3 80.8234 -R581 VOUT.t3 VOUT.n534 80.8234 -R582 VOUT.n510 VOUT.n509 71.676 -R583 VOUT.n505 VOUT.n400 71.676 -R584 VOUT.n501 VOUT.n399 71.676 -R585 VOUT.n497 VOUT.n398 71.676 -R586 VOUT.n493 VOUT.n397 71.676 -R587 VOUT.n489 VOUT.n396 71.676 -R588 VOUT.n484 VOUT.n395 71.676 -R589 VOUT.n480 VOUT.n394 71.676 -R590 VOUT.n476 VOUT.n393 71.676 -R591 VOUT.n472 VOUT.n392 71.676 -R592 VOUT.n468 VOUT.n391 71.676 -R593 VOUT.n464 VOUT.n390 71.676 -R594 VOUT.n460 VOUT.n389 71.676 -R595 VOUT.n456 VOUT.n388 71.676 -R596 VOUT.n451 VOUT.n387 71.676 -R597 VOUT.n447 VOUT.n386 71.676 -R598 VOUT.n625 VOUT.n624 71.676 -R599 VOUT.n619 VOUT.n295 71.676 -R600 VOUT.n616 VOUT.n296 71.676 -R601 VOUT.n612 VOUT.n297 71.676 -R602 VOUT.n608 VOUT.n298 71.676 -R603 VOUT.n604 VOUT.n299 71.676 -R604 VOUT.n600 VOUT.n300 71.676 -R605 VOUT.n595 VOUT.n301 71.676 -R606 VOUT.n591 VOUT.n302 71.676 -R607 VOUT.n587 VOUT.n303 71.676 -R608 VOUT.n583 VOUT.n304 71.676 -R609 VOUT.n579 VOUT.n305 71.676 -R610 VOUT.n575 VOUT.n306 71.676 -R611 VOUT.n571 VOUT.n307 71.676 -R612 VOUT.n567 VOUT.n308 71.676 -R613 VOUT.n562 VOUT.n309 71.676 -R614 VOUT.n625 VOUT.n312 71.676 -R615 VOUT.n617 VOUT.n295 71.676 -R616 VOUT.n613 VOUT.n296 71.676 -R617 VOUT.n609 VOUT.n297 71.676 -R618 VOUT.n605 VOUT.n298 71.676 -R619 VOUT.n601 VOUT.n299 71.676 -R620 VOUT.n596 VOUT.n300 71.676 -R621 VOUT.n592 VOUT.n301 71.676 -R622 VOUT.n588 VOUT.n302 71.676 -R623 VOUT.n584 VOUT.n303 71.676 -R624 VOUT.n580 VOUT.n304 71.676 -R625 VOUT.n576 VOUT.n305 71.676 -R626 VOUT.n572 VOUT.n306 71.676 -R627 VOUT.n568 VOUT.n307 71.676 -R628 VOUT.n563 VOUT.n308 71.676 -R629 VOUT.n559 VOUT.n309 71.676 -R630 VOUT.n450 VOUT.n386 71.676 -R631 VOUT.n455 VOUT.n387 71.676 -R632 VOUT.n459 VOUT.n388 71.676 -R633 VOUT.n463 VOUT.n389 71.676 -R634 VOUT.n467 VOUT.n390 71.676 -R635 VOUT.n471 VOUT.n391 71.676 -R636 VOUT.n475 VOUT.n392 71.676 -R637 VOUT.n479 VOUT.n393 71.676 -R638 VOUT.n483 VOUT.n394 71.676 -R639 VOUT.n488 VOUT.n395 71.676 -R640 VOUT.n492 VOUT.n396 71.676 -R641 VOUT.n496 VOUT.n397 71.676 -R642 VOUT.n500 VOUT.n398 71.676 -R643 VOUT.n504 VOUT.n399 71.676 -R644 VOUT.n402 VOUT.n400 71.676 -R645 VOUT.n510 VOUT.n401 71.676 -R646 VOUT.n221 VOUT.n152 71.676 -R647 VOUT.n219 VOUT.n154 71.676 -R648 VOUT.n215 VOUT.n214 71.676 -R649 VOUT.n208 VOUT.n156 71.676 -R650 VOUT.n207 VOUT.n206 71.676 -R651 VOUT.n199 VOUT.n158 71.676 -R652 VOUT.n198 VOUT.n197 71.676 -R653 VOUT.n191 VOUT.n162 71.676 -R654 VOUT.n190 VOUT.n189 71.676 -R655 VOUT.n183 VOUT.n164 71.676 -R656 VOUT.n182 VOUT.n181 71.676 -R657 VOUT.n175 VOUT.n166 71.676 -R658 VOUT.n174 VOUT.n170 71.676 -R659 VOUT.n37 VOUT.n17 71.676 -R660 VOUT.n41 VOUT.n18 71.676 -R661 VOUT.n45 VOUT.n19 71.676 -R662 VOUT.n49 VOUT.n20 71.676 -R663 VOUT.n53 VOUT.n21 71.676 -R664 VOUT.n57 VOUT.n22 71.676 -R665 VOUT.n61 VOUT.n23 71.676 -R666 VOUT.n65 VOUT.n24 71.676 -R667 VOUT.n69 VOUT.n25 71.676 -R668 VOUT.n93 VOUT.n26 71.676 -R669 VOUT.n97 VOUT.n27 71.676 -R670 VOUT.n101 VOUT.n28 71.676 -R671 VOUT.n105 VOUT.n29 71.676 -R672 VOUT.n294 VOUT.n293 71.676 -R673 VOUT.n222 VOUT.n221 71.676 -R674 VOUT.n216 VOUT.n154 71.676 -R675 VOUT.n214 VOUT.n213 71.676 -R676 VOUT.n209 VOUT.n208 71.676 -R677 VOUT.n206 VOUT.n205 71.676 -R678 VOUT.n200 VOUT.n199 71.676 -R679 VOUT.n197 VOUT.n196 71.676 -R680 VOUT.n192 VOUT.n191 71.676 -R681 VOUT.n189 VOUT.n188 71.676 -R682 VOUT.n184 VOUT.n183 71.676 -R683 VOUT.n181 VOUT.n180 71.676 -R684 VOUT.n176 VOUT.n175 71.676 -R685 VOUT.n171 VOUT.n170 71.676 -R686 VOUT.n294 VOUT.n30 71.676 -R687 VOUT.n102 VOUT.n29 71.676 -R688 VOUT.n98 VOUT.n28 71.676 -R689 VOUT.n94 VOUT.n27 71.676 -R690 VOUT.n70 VOUT.n26 71.676 -R691 VOUT.n66 VOUT.n25 71.676 -R692 VOUT.n62 VOUT.n24 71.676 -R693 VOUT.n58 VOUT.n23 71.676 -R694 VOUT.n54 VOUT.n22 71.676 -R695 VOUT.n50 VOUT.n21 71.676 -R696 VOUT.n46 VOUT.n20 71.676 -R697 VOUT.n42 VOUT.n19 71.676 -R698 VOUT.n38 VOUT.n18 71.676 -R699 VOUT.n17 VOUT.n14 71.676 -R700 VOUT.n86 VOUT.n78 58.1631 -R701 VOUT.n406 VOUT.n405 52.3641 -R702 VOUT.n408 VOUT.n407 52.3641 -R703 VOUT.n318 VOUT.n317 52.3641 -R704 VOUT.n316 VOUT.n315 52.3641 -R705 VOUT.n81 VOUT.t4 52.3082 -R706 VOUT.n74 VOUT.t5 52.3082 -R707 VOUT.n86 VOUT.n85 48.0884 -R708 VOUT.t25 VOUT.n139 45.2613 -R709 VOUT.t11 VOUT.n285 45.2613 -R710 VOUT.n168 VOUT.n167 44.6066 -R711 VOUT.n160 VOUT.n159 44.6066 -R712 VOUT.n34 VOUT.n33 44.6066 -R713 VOUT.n32 VOUT.n31 44.6066 -R714 VOUT.n486 VOUT.n406 34.3278 -R715 VOUT.n453 VOUT.n408 34.3278 -R716 VOUT.n565 VOUT.n318 34.3278 -R717 VOUT.n598 VOUT.n316 34.3278 -R718 VOUT.n169 VOUT.n168 34.3278 -R719 VOUT.n202 VOUT.n160 34.3278 -R720 VOUT.n35 VOUT.n34 34.3278 -R721 VOUT.n104 VOUT.n32 34.3278 -R722 VOUT.n403 VOUT.n383 31.609 -R723 VOUT.n448 VOUT.n446 31.609 -R724 VOUT.n623 VOUT.n314 31.609 -R725 VOUT.n560 VOUT.n319 31.609 -R726 VOUT.n225 VOUT.n224 26.8956 -R727 VOUT.n231 VOUT.n149 26.8956 -R728 VOUT.n631 VOUT.n12 26.8956 -R729 VOUT.n292 VOUT.n291 26.8956 -R730 VOUT.n334 VOUT.n330 19.3944 -R731 VOUT.n334 VOUT.n329 19.3944 -R732 VOUT.n548 VOUT.n329 19.3944 -R733 VOUT.n548 VOUT.n547 19.3944 -R734 VOUT.n547 VOUT.n546 19.3944 -R735 VOUT.n546 VOUT.n340 19.3944 -R736 VOUT.n540 VOUT.n340 19.3944 -R737 VOUT.n540 VOUT.n539 19.3944 -R738 VOUT.n539 VOUT.n538 19.3944 -R739 VOUT.n538 VOUT.n351 19.3944 -R740 VOUT.n532 VOUT.n351 19.3944 -R741 VOUT.n532 VOUT.n531 19.3944 -R742 VOUT.n531 VOUT.n530 19.3944 -R743 VOUT.n530 VOUT.n362 19.3944 -R744 VOUT.n524 VOUT.n362 19.3944 -R745 VOUT.n524 VOUT.n523 19.3944 -R746 VOUT.n523 VOUT.n522 19.3944 -R747 VOUT.n522 VOUT.n373 19.3944 -R748 VOUT.n516 VOUT.n373 19.3944 -R749 VOUT.n516 VOUT.n515 19.3944 -R750 VOUT.n515 VOUT.n514 19.3944 -R751 VOUT.n557 VOUT.n556 19.3944 -R752 VOUT.n556 VOUT.n321 19.3944 -R753 VOUT.n552 VOUT.n321 19.3944 -R754 VOUT.n552 VOUT.n323 19.3944 -R755 VOUT.n417 VOUT.n323 19.3944 -R756 VOUT.n417 VOUT.n416 19.3944 -R757 VOUT.n421 VOUT.n416 19.3944 -R758 VOUT.n423 VOUT.n421 19.3944 -R759 VOUT.n424 VOUT.n423 19.3944 -R760 VOUT.n424 VOUT.n414 19.3944 -R761 VOUT.n428 VOUT.n414 19.3944 -R762 VOUT.n430 VOUT.n428 19.3944 -R763 VOUT.n431 VOUT.n430 19.3944 -R764 VOUT.n431 VOUT.n412 19.3944 -R765 VOUT.n435 VOUT.n412 19.3944 -R766 VOUT.n437 VOUT.n435 19.3944 -R767 VOUT.n438 VOUT.n437 19.3944 -R768 VOUT.n438 VOUT.n410 19.3944 -R769 VOUT.n442 VOUT.n410 19.3944 -R770 VOUT.n444 VOUT.n442 19.3944 -R771 VOUT.n445 VOUT.n444 19.3944 -R772 VOUT.n226 VOUT.n143 19.3944 -R773 VOUT.n239 VOUT.n143 19.3944 -R774 VOUT.n239 VOUT.n141 19.3944 -R775 VOUT.n243 VOUT.n141 19.3944 -R776 VOUT.n243 VOUT.n130 19.3944 -R777 VOUT.n257 VOUT.n130 19.3944 -R778 VOUT.n257 VOUT.n128 19.3944 -R779 VOUT.n261 VOUT.n128 19.3944 -R780 VOUT.n262 VOUT.n261 19.3944 -R781 VOUT.n262 VOUT.n1 19.3944 -R782 VOUT.n642 VOUT.n1 19.3944 -R783 VOUT.n642 VOUT.n641 19.3944 -R784 VOUT.n641 VOUT.n640 19.3944 -R785 VOUT.n640 VOUT.n6 19.3944 -R786 VOUT.n636 VOUT.n6 19.3944 -R787 VOUT.n636 VOUT.n635 19.3944 -R788 VOUT.n635 VOUT.n634 19.3944 -R789 VOUT.n634 VOUT.n11 19.3944 -R790 VOUT.n630 VOUT.n11 19.3944 -R791 VOUT.n230 VOUT.n147 19.3944 -R792 VOUT.n235 VOUT.n147 19.3944 -R793 VOUT.n235 VOUT.n148 19.3944 -R794 VOUT.n148 VOUT.n137 19.3944 -R795 VOUT.n248 VOUT.n137 19.3944 -R796 VOUT.n248 VOUT.n135 19.3944 -R797 VOUT.n252 VOUT.n135 19.3944 -R798 VOUT.n252 VOUT.n123 19.3944 -R799 VOUT.n266 VOUT.n123 19.3944 -R800 VOUT.n266 VOUT.n121 19.3944 -R801 VOUT.n270 VOUT.n121 19.3944 -R802 VOUT.n270 VOUT.n117 19.3944 -R803 VOUT.n276 VOUT.n117 19.3944 -R804 VOUT.n276 VOUT.n114 19.3944 -R805 VOUT.n282 VOUT.n114 19.3944 -R806 VOUT.n282 VOUT.n115 19.3944 -R807 VOUT.n115 VOUT.n109 19.3944 -R808 VOUT.n289 VOUT.n109 19.3944 -R809 VOUT.n290 VOUT.n289 19.3944 -R810 VOUT.n90 VOUT.n89 18.0638 -R811 VOUT.n88 VOUT.n87 13.041 -R812 VOUT.n550 VOUT.t7 12.9322 -R813 VOUT.n519 VOUT.t15 12.9322 -R814 VOUT.n404 VOUT.n403 10.6151 -R815 VOUT.n508 VOUT.n404 10.6151 -R816 VOUT.n508 VOUT.n507 10.6151 -R817 VOUT.n507 VOUT.n506 10.6151 -R818 VOUT.n506 VOUT.n503 10.6151 -R819 VOUT.n503 VOUT.n502 10.6151 -R820 VOUT.n502 VOUT.n499 10.6151 -R821 VOUT.n499 VOUT.n498 10.6151 -R822 VOUT.n498 VOUT.n495 10.6151 -R823 VOUT.n495 VOUT.n494 10.6151 -R824 VOUT.n494 VOUT.n491 10.6151 -R825 VOUT.n491 VOUT.n490 10.6151 -R826 VOUT.n490 VOUT.n487 10.6151 -R827 VOUT.n485 VOUT.n482 10.6151 -R828 VOUT.n482 VOUT.n481 10.6151 -R829 VOUT.n481 VOUT.n478 10.6151 -R830 VOUT.n478 VOUT.n477 10.6151 -R831 VOUT.n477 VOUT.n474 10.6151 -R832 VOUT.n474 VOUT.n473 10.6151 -R833 VOUT.n473 VOUT.n470 10.6151 -R834 VOUT.n470 VOUT.n469 10.6151 -R835 VOUT.n469 VOUT.n466 10.6151 -R836 VOUT.n466 VOUT.n465 10.6151 -R837 VOUT.n465 VOUT.n462 10.6151 -R838 VOUT.n462 VOUT.n461 10.6151 -R839 VOUT.n461 VOUT.n458 10.6151 -R840 VOUT.n458 VOUT.n457 10.6151 -R841 VOUT.n457 VOUT.n454 10.6151 -R842 VOUT.n452 VOUT.n449 10.6151 -R843 VOUT.n449 VOUT.n448 10.6151 -R844 VOUT.n623 VOUT.n622 10.6151 -R845 VOUT.n622 VOUT.n621 10.6151 -R846 VOUT.n621 VOUT.n620 10.6151 -R847 VOUT.n620 VOUT.n618 10.6151 -R848 VOUT.n618 VOUT.n615 10.6151 -R849 VOUT.n615 VOUT.n614 10.6151 -R850 VOUT.n614 VOUT.n611 10.6151 -R851 VOUT.n611 VOUT.n610 10.6151 -R852 VOUT.n610 VOUT.n607 10.6151 -R853 VOUT.n607 VOUT.n606 10.6151 -R854 VOUT.n606 VOUT.n603 10.6151 -R855 VOUT.n603 VOUT.n602 10.6151 -R856 VOUT.n602 VOUT.n599 10.6151 -R857 VOUT.n597 VOUT.n594 10.6151 -R858 VOUT.n594 VOUT.n593 10.6151 -R859 VOUT.n593 VOUT.n590 10.6151 -R860 VOUT.n590 VOUT.n589 10.6151 -R861 VOUT.n589 VOUT.n586 10.6151 -R862 VOUT.n586 VOUT.n585 10.6151 -R863 VOUT.n585 VOUT.n582 10.6151 -R864 VOUT.n582 VOUT.n581 10.6151 -R865 VOUT.n581 VOUT.n578 10.6151 -R866 VOUT.n578 VOUT.n577 10.6151 -R867 VOUT.n577 VOUT.n574 10.6151 -R868 VOUT.n574 VOUT.n573 10.6151 -R869 VOUT.n573 VOUT.n570 10.6151 -R870 VOUT.n570 VOUT.n569 10.6151 -R871 VOUT.n569 VOUT.n566 10.6151 -R872 VOUT.n564 VOUT.n561 10.6151 -R873 VOUT.n561 VOUT.n560 10.6151 -R874 VOUT.n224 VOUT.n223 10.6151 -R875 VOUT.n223 VOUT.n153 10.6151 -R876 VOUT.n218 VOUT.n153 10.6151 -R877 VOUT.n218 VOUT.n217 10.6151 -R878 VOUT.n217 VOUT.n155 10.6151 -R879 VOUT.n212 VOUT.n155 10.6151 -R880 VOUT.n212 VOUT.n211 10.6151 -R881 VOUT.n211 VOUT.n210 10.6151 -R882 VOUT.n210 VOUT.n157 10.6151 -R883 VOUT.n204 VOUT.n157 10.6151 -R884 VOUT.n204 VOUT.n203 10.6151 -R885 VOUT.n201 VOUT.n161 10.6151 -R886 VOUT.n195 VOUT.n161 10.6151 -R887 VOUT.n195 VOUT.n194 10.6151 -R888 VOUT.n194 VOUT.n193 10.6151 -R889 VOUT.n193 VOUT.n163 10.6151 -R890 VOUT.n187 VOUT.n163 10.6151 -R891 VOUT.n187 VOUT.n186 10.6151 -R892 VOUT.n186 VOUT.n185 10.6151 -R893 VOUT.n185 VOUT.n165 10.6151 -R894 VOUT.n179 VOUT.n165 10.6151 -R895 VOUT.n179 VOUT.n178 10.6151 -R896 VOUT.n178 VOUT.n177 10.6151 -R897 VOUT.n173 VOUT.n172 10.6151 -R898 VOUT.n172 VOUT.n149 10.6151 -R899 VOUT.n36 VOUT.n12 10.6151 -R900 VOUT.n39 VOUT.n36 10.6151 -R901 VOUT.n40 VOUT.n39 10.6151 -R902 VOUT.n43 VOUT.n40 10.6151 -R903 VOUT.n44 VOUT.n43 10.6151 -R904 VOUT.n47 VOUT.n44 10.6151 -R905 VOUT.n48 VOUT.n47 10.6151 -R906 VOUT.n51 VOUT.n48 10.6151 -R907 VOUT.n52 VOUT.n51 10.6151 -R908 VOUT.n55 VOUT.n52 10.6151 -R909 VOUT.n56 VOUT.n55 10.6151 -R910 VOUT.n60 VOUT.n59 10.6151 -R911 VOUT.n63 VOUT.n60 10.6151 -R912 VOUT.n64 VOUT.n63 10.6151 -R913 VOUT.n67 VOUT.n64 10.6151 -R914 VOUT.n68 VOUT.n67 10.6151 -R915 VOUT.n71 VOUT.n68 10.6151 -R916 VOUT.n95 VOUT.n92 10.6151 -R917 VOUT.n96 VOUT.n95 10.6151 -R918 VOUT.n99 VOUT.n96 10.6151 -R919 VOUT.n100 VOUT.n99 10.6151 -R920 VOUT.n103 VOUT.n100 10.6151 -R921 VOUT.n107 VOUT.n106 10.6151 -R922 VOUT.n292 VOUT.n107 10.6151 -R923 VOUT.n454 VOUT.n453 9.83465 -R924 VOUT.n566 VOUT.n565 9.83465 -R925 VOUT.n202 VOUT.n201 9.83465 -R926 VOUT.n59 VOUT.n35 9.83465 -R927 VOUT.n82 VOUT.n80 9.71174 -R928 VOUT.n75 VOUT.n73 9.71174 -R929 VOUT.n85 VOUT.n84 9.45567 -R930 VOUT.n78 VOUT.n77 9.45567 -R931 VOUT.n84 VOUT.n83 9.3005 -R932 VOUT.n77 VOUT.n76 9.3005 -R933 VOUT.n556 VOUT.n555 9.3005 -R934 VOUT.n554 VOUT.n321 9.3005 -R935 VOUT.n553 VOUT.n552 9.3005 -R936 VOUT.n323 VOUT.n322 9.3005 -R937 VOUT.n418 VOUT.n417 9.3005 -R938 VOUT.n419 VOUT.n416 9.3005 -R939 VOUT.n421 VOUT.n420 9.3005 -R940 VOUT.n423 VOUT.n415 9.3005 -R941 VOUT.n425 VOUT.n424 9.3005 -R942 VOUT.n426 VOUT.n414 9.3005 -R943 VOUT.n428 VOUT.n427 9.3005 -R944 VOUT.n430 VOUT.n413 9.3005 -R945 VOUT.n432 VOUT.n431 9.3005 -R946 VOUT.n433 VOUT.n412 9.3005 -R947 VOUT.n435 VOUT.n434 9.3005 -R948 VOUT.n437 VOUT.n411 9.3005 -R949 VOUT.n439 VOUT.n438 9.3005 -R950 VOUT.n440 VOUT.n410 9.3005 -R951 VOUT.n442 VOUT.n441 9.3005 -R952 VOUT.n444 VOUT.n409 9.3005 -R953 VOUT.n446 VOUT.n445 9.3005 -R954 VOUT.n557 VOUT.n319 9.3005 -R955 VOUT.n330 VOUT.n314 9.3005 -R956 VOUT.n335 VOUT.n334 9.3005 -R957 VOUT.n336 VOUT.n329 9.3005 -R958 VOUT.n548 VOUT.n337 9.3005 -R959 VOUT.n547 VOUT.n338 9.3005 -R960 VOUT.n546 VOUT.n339 9.3005 -R961 VOUT.n347 VOUT.n340 9.3005 -R962 VOUT.n540 VOUT.n348 9.3005 -R963 VOUT.n539 VOUT.n349 9.3005 -R964 VOUT.n538 VOUT.n350 9.3005 -R965 VOUT.n358 VOUT.n351 9.3005 -R966 VOUT.n532 VOUT.n359 9.3005 -R967 VOUT.n531 VOUT.n360 9.3005 -R968 VOUT.n530 VOUT.n361 9.3005 -R969 VOUT.n369 VOUT.n362 9.3005 -R970 VOUT.n524 VOUT.n370 9.3005 -R971 VOUT.n523 VOUT.n371 9.3005 -R972 VOUT.n522 VOUT.n372 9.3005 -R973 VOUT.n380 VOUT.n373 9.3005 -R974 VOUT.n516 VOUT.n381 9.3005 -R975 VOUT.n515 VOUT.n382 9.3005 -R976 VOUT.n514 VOUT.n383 9.3005 -R977 VOUT.n232 VOUT.n147 9.3005 -R978 VOUT.n235 VOUT.n234 9.3005 -R979 VOUT.n233 VOUT.n148 9.3005 -R980 VOUT.n137 VOUT.n136 9.3005 -R981 VOUT.n249 VOUT.n248 9.3005 -R982 VOUT.n250 VOUT.n135 9.3005 -R983 VOUT.n252 VOUT.n251 9.3005 -R984 VOUT.n123 VOUT.n122 9.3005 -R985 VOUT.n267 VOUT.n266 9.3005 -R986 VOUT.n268 VOUT.n121 9.3005 -R987 VOUT.n270 VOUT.n269 9.3005 -R988 VOUT.n117 VOUT.n116 9.3005 -R989 VOUT.n277 VOUT.n276 9.3005 -R990 VOUT.n278 VOUT.n114 9.3005 -R991 VOUT.n282 VOUT.n281 9.3005 -R992 VOUT.n280 VOUT.n115 9.3005 -R993 VOUT.n279 VOUT.n109 9.3005 -R994 VOUT.n289 VOUT.n108 9.3005 -R995 VOUT.n291 VOUT.n290 9.3005 -R996 VOUT.n231 VOUT.n230 9.3005 -R997 VOUT.n143 VOUT.n142 9.3005 -R998 VOUT.n240 VOUT.n239 9.3005 -R999 VOUT.n241 VOUT.n141 9.3005 -R1000 VOUT.n243 VOUT.n242 9.3005 -R1001 VOUT.n130 VOUT.n129 9.3005 -R1002 VOUT.n258 VOUT.n257 9.3005 -R1003 VOUT.n259 VOUT.n128 9.3005 -R1004 VOUT.n261 VOUT.n260 9.3005 -R1005 VOUT.n262 VOUT.n0 9.3005 -R1006 VOUT.n226 VOUT.n225 9.3005 -R1007 VBULK VOUT.n1 9.3005 -R1008 VOUT.n643 VOUT.n642 9.3005 -R1009 VOUT.n641 VOUT.n2 9.3005 -R1010 VOUT.n640 VOUT.n639 9.3005 -R1011 VOUT.n638 VOUT.n6 9.3005 -R1012 VOUT.n637 VOUT.n636 9.3005 -R1013 VOUT.n635 VOUT.n7 9.3005 -R1014 VOUT.n634 VOUT.n633 9.3005 -R1015 VOUT.n632 VOUT.n11 9.3005 -R1016 VOUT.n631 VOUT.n630 9.3005 -R1017 VOUT.n92 VOUT.n91 8.42977 -R1018 VOUT.n85 VOUT.n79 8.14595 -R1019 VOUT.n78 VOUT.n72 8.14595 -R1020 VOUT.n83 VOUT.n82 7.3702 -R1021 VOUT.n76 VOUT.n75 7.3702 -R1022 VOUT.n487 VOUT.n486 6.0883 -R1023 VOUT.n599 VOUT.n598 6.0883 -R1024 VOUT.n83 VOUT.n79 5.81868 -R1025 VOUT.n76 VOUT.n72 5.81868 -R1026 VOUT.n173 VOUT.n169 5.46391 -R1027 VOUT.n106 VOUT.n104 5.46391 -R1028 VOUT.n87 VOUT.n86 5.15639 -R1029 VOUT.n177 VOUT.n169 5.15172 -R1030 VOUT.n104 VOUT.n103 5.15172 -R1031 VOUT.n486 VOUT.n485 4.52733 -R1032 VOUT.n598 VOUT.n597 4.52733 -R1033 VOUT.n84 VOUT.n80 3.44771 -R1034 VOUT.n77 VOUT.n73 3.44771 -R1035 VOUT.n91 VOUT.n71 2.18587 -R1036 VOUT.n453 VOUT.n452 0.780988 -R1037 VOUT.n565 VOUT.n564 0.780988 -R1038 VOUT.n203 VOUT.n202 0.780988 -R1039 VOUT.n56 VOUT.n35 0.780988 -R1040 VOUT.n555 VOUT.n319 0.152939 -R1041 VOUT.n555 VOUT.n554 0.152939 -R1042 VOUT.n554 VOUT.n553 0.152939 -R1043 VOUT.n553 VOUT.n322 0.152939 -R1044 VOUT.n418 VOUT.n322 0.152939 -R1045 VOUT.n419 VOUT.n418 0.152939 -R1046 VOUT.n420 VOUT.n419 0.152939 -R1047 VOUT.n420 VOUT.n415 0.152939 -R1048 VOUT.n425 VOUT.n415 0.152939 -R1049 VOUT.n426 VOUT.n425 0.152939 -R1050 VOUT.n427 VOUT.n426 0.152939 -R1051 VOUT.n427 VOUT.n413 0.152939 -R1052 VOUT.n432 VOUT.n413 0.152939 -R1053 VOUT.n433 VOUT.n432 0.152939 -R1054 VOUT.n434 VOUT.n433 0.152939 -R1055 VOUT.n434 VOUT.n411 0.152939 -R1056 VOUT.n439 VOUT.n411 0.152939 -R1057 VOUT.n440 VOUT.n439 0.152939 -R1058 VOUT.n441 VOUT.n440 0.152939 -R1059 VOUT.n441 VOUT.n409 0.152939 -R1060 VOUT.n446 VOUT.n409 0.152939 -R1061 VOUT.n335 VOUT.n314 0.152939 -R1062 VOUT.n336 VOUT.n335 0.152939 -R1063 VOUT.n337 VOUT.n336 0.152939 -R1064 VOUT.n338 VOUT.n337 0.152939 -R1065 VOUT.n339 VOUT.n338 0.152939 -R1066 VOUT.n347 VOUT.n339 0.152939 -R1067 VOUT.n348 VOUT.n347 0.152939 -R1068 VOUT.n349 VOUT.n348 0.152939 -R1069 VOUT.n350 VOUT.n349 0.152939 -R1070 VOUT.n358 VOUT.n350 0.152939 -R1071 VOUT.n359 VOUT.n358 0.152939 -R1072 VOUT.n360 VOUT.n359 0.152939 -R1073 VOUT.n361 VOUT.n360 0.152939 -R1074 VOUT.n369 VOUT.n361 0.152939 -R1075 VOUT.n370 VOUT.n369 0.152939 -R1076 VOUT.n371 VOUT.n370 0.152939 -R1077 VOUT.n372 VOUT.n371 0.152939 -R1078 VOUT.n380 VOUT.n372 0.152939 -R1079 VOUT.n381 VOUT.n380 0.152939 -R1080 VOUT.n382 VOUT.n381 0.152939 -R1081 VOUT.n383 VOUT.n382 0.152939 -R1082 VOUT.n232 VOUT.n231 0.152939 -R1083 VOUT.n234 VOUT.n232 0.152939 -R1084 VOUT.n234 VOUT.n233 0.152939 -R1085 VOUT.n233 VOUT.n136 0.152939 -R1086 VOUT.n249 VOUT.n136 0.152939 -R1087 VOUT.n250 VOUT.n249 0.152939 -R1088 VOUT.n251 VOUT.n250 0.152939 -R1089 VOUT.n251 VOUT.n122 0.152939 -R1090 VOUT.n267 VOUT.n122 0.152939 -R1091 VOUT.n268 VOUT.n267 0.152939 -R1092 VOUT.n269 VOUT.n268 0.152939 -R1093 VOUT.n269 VOUT.n116 0.152939 -R1094 VOUT.n277 VOUT.n116 0.152939 -R1095 VOUT.n278 VOUT.n277 0.152939 -R1096 VOUT.n281 VOUT.n278 0.152939 -R1097 VOUT.n281 VOUT.n280 0.152939 -R1098 VOUT.n280 VOUT.n279 0.152939 -R1099 VOUT.n279 VOUT.n108 0.152939 -R1100 VOUT.n291 VOUT.n108 0.152939 -R1101 VOUT.n225 VOUT.n142 0.152939 -R1102 VOUT.n240 VOUT.n142 0.152939 -R1103 VOUT.n241 VOUT.n240 0.152939 -R1104 VOUT.n242 VOUT.n241 0.152939 -R1105 VOUT.n242 VOUT.n129 0.152939 -R1106 VOUT.n258 VOUT.n129 0.152939 -R1107 VOUT.n259 VOUT.n258 0.152939 -R1108 VOUT.n260 VOUT.n259 0.152939 -R1109 VOUT.n260 VOUT.n0 0.152939 -R1110 VBULK VOUT.n643 0.152939 -R1111 VOUT.n643 VOUT.n2 0.152939 -R1112 VOUT.n639 VOUT.n2 0.152939 -R1113 VOUT.n639 VOUT.n638 0.152939 -R1114 VOUT.n638 VOUT.n637 0.152939 -R1115 VOUT.n637 VOUT.n7 0.152939 -R1116 VOUT.n633 VOUT.n7 0.152939 -R1117 VOUT.n633 VOUT.n632 0.152939 -R1118 VOUT.n632 VOUT.n631 0.152939 -R1119 VBULK VOUT.n0 0.1255 -R1120 VOUT.n87 VOUT 0.07175 -R1121 VOUT.n89 VOUT.n88 0.0252093 -R1122 Ib.n3 Ib.n1 289.615 -R1123 Ib.n10 Ib.n8 289.615 -R1124 Ib.n4 Ib.n3 185 -R1125 Ib.n11 Ib.n10 185 -R1126 Ib.t0 Ib.n2 167.117 -R1127 Ib.t1 Ib.n9 167.117 -R1128 Ib.n15 Ib.n14 97.7613 -R1129 Ib.n15 Ib.n7 87.9624 -R1130 Ib.n0 Ib.t2 77.9525 -R1131 Ib.n0 Ib.t3 73.2951 -R1132 Ib.n3 Ib.t0 52.3082 -R1133 Ib.n10 Ib.t1 52.3082 -R1134 Ib Ib.n0 20.9423 -R1135 Ib.n4 Ib.n2 9.71174 -R1136 Ib.n11 Ib.n9 9.71174 -R1137 Ib.n7 Ib.n6 9.45567 -R1138 Ib.n14 Ib.n13 9.45567 -R1139 Ib.n6 Ib.n5 9.3005 -R1140 Ib.n13 Ib.n12 9.3005 -R1141 Ib.n7 Ib.n1 8.14595 -R1142 Ib.n14 Ib.n8 8.14595 -R1143 Ib.n5 Ib.n4 7.3702 -R1144 Ib.n12 Ib.n11 7.3702 -R1145 Ib.n5 Ib.n1 5.81868 -R1146 Ib.n12 Ib.n8 5.81868 -R1147 Ib Ib.n15 5.27074 -R1148 Ib.n6 Ib.n2 3.44771 -R1149 Ib.n13 Ib.n9 3.44771 -R1150 VIN.n0 VIN.t1 81.8275 -R1151 VIN.n0 VIN.t0 69.7713 -R1152 VIN VIN.n0 0.0149903 -C0 VIN Ib 0.696867f -C1 Ib VOUT 11.6612f -C2 VIN VOUT 3.87686f -.ends - diff --git a/src/glayout/blocks/elementary/current_mirror/current_mirror.md b/src/glayout/blocks/elementary/current_mirror/current_mirror.md deleted file mode 100644 index fff2c365..00000000 --- a/src/glayout/blocks/elementary/current_mirror/current_mirror.md +++ /dev/null @@ -1,8 +0,0 @@ -# current mirror - -... - -AL: Sep 29 2025 - -Migrated from Arnav's fork of OpenFASOC -- Updated code to make it compatible with latest new gLayout repo \ No newline at end of file diff --git a/src/glayout/blocks/elementary/diff_pair/diff_pair.md b/src/glayout/blocks/elementary/diff_pair/diff_pair.md deleted file mode 100644 index fc8585cb..00000000 --- a/src/glayout/blocks/elementary/diff_pair/diff_pair.md +++ /dev/null @@ -1,10 +0,0 @@ -# differential pair - -... - -AL: Sep 29 2025 - -Migrated from Arnav's fork of OpenFASOC -- Updated code to make it compatible with latest new gLayout repo -- There're some issue with the add_df_labels function -- The \_\_main\_\_ code need to be updated. diff --git a/src/glayout/blocks/elementary/transmission_gate/transmission_gate.md b/src/glayout/blocks/elementary/transmission_gate/transmission_gate.md deleted file mode 100644 index fff2c365..00000000 --- a/src/glayout/blocks/elementary/transmission_gate/transmission_gate.md +++ /dev/null @@ -1,8 +0,0 @@ -# current mirror - -... - -AL: Sep 29 2025 - -Migrated from Arnav's fork of OpenFASOC -- Updated code to make it compatible with latest new gLayout repo \ No newline at end of file diff --git a/src/glayout/blocks/evaluator_box/evaluator_box.md b/src/glayout/blocks/evaluator_box/evaluator_box.md deleted file mode 100644 index 2cfbd019..00000000 --- a/src/glayout/blocks/evaluator_box/evaluator_box.md +++ /dev/null @@ -1,7 +0,0 @@ -# Evaluator Box - -AL: Sep 29 2025 - -Migrated from Arnav's fork of OpenFASOC -- Updated code to make it compatible with latest new gLayout repo -- Not tested yet \ No newline at end of file